2017-09-22 58 views
0

假設我有一個矩陣rmatrix定義如下:替換與NA的矩陣的元素爲那些與行和列名沒有存儲在數據幀

set.seed(10) 
rmatrix <- matrix(sample(0:100, 16), ncol=4) 
dimnames(rmatrix) <- list(rownames(rmatrix, do.NULL = FALSE, 
    prefix = "row"), colnames(rmatrix, do.NULL = FALSE, prefix = "col")) 
rmatrix 

    col1 col2 col3 col4 
row1 51 8 57 10 
row2 30 21 39 52 
row3 42 26 59 31 
row4 67 25 100 36 

甲數據幀df存儲行和列的一些組合的rmatrix名稱:

df <- data.frame(r = c('row1', 'row1', 'row3', 'row4', 'row4', 'row4'), 
    c = c('col2', 'col4', 'col3', 'col3', 'col1', 'col2')) 
df 
    r c 
1 row1 col2 
2 row1 col4 
3 row3 col3 
4 row4 col3 
5 row4 col1 
6 row4 col2 

如何rmatrix任何元素變爲NA如果它的名字不是在df?謝謝!

回答

3
out = replace(rmatrix*NA, as.matrix(df), rmatrix[as.matrix(df)]) 
out 
#  col1 col2 col3 col4 
#row1 NA 8 NA 10 
#row2 NA NA NA NA 
#row3 NA NA 59 NA 
#row4 67 25 100 NA 

包裹被轉換成一個正常的矩陣以下,即使rmatrix由會工作字符

replace(replace(rmatrix, TRUE, NA), as.matrix(df), rmatrix[as.matrix(df)]) 
2

我們可以做到這一點直接基於setdiff

library(dplyr) 
rmatrix[as.matrix(setdiff(data.frame(r = rownames(rmatrix)[row(rmatrix)], 
    c= colnames(rmatrix)[col(rmatrix)]), df))] <- NA 
rmatrix 
#  col1 col2 col3 col4 
#row1 NA 8 NA 10 
#row2 NA NA NA NA 
#row3 NA NA 59 NA 
#row4 67 25 100 NA 

或者另一種選擇是創建NAS的一個新的矩陣,然後基於在「DF」

的指標值進行填充
m1 <- sapply(df, function(x) as.numeric(gsub("\\D+", "", x))) 
rmatrix2 <- matrix(NA, nrow = nrow(rmatrix), ncol = ncol(rmatrix), 
        dimnames = dimnames(rmatrix)) 
rmatrix2[m1] <- rmatrix[m1] 
rmatrix2 
#  [,1] [,2] [,3] [,4] 
#[1,] NA 8 NA 10 
#[2,] NA NA NA NA 
#[3,] NA NA 59 NA 
#[4,] 67 25 100 NA 

或者,我們可以創建一個sparseMatrix

library(Matrix) 
r1 <- sparseMatrix(i = match(df[[1]], row.names(rmatrix)), 
    j = match(df[[2]], colnames(rmatrix)), x = rmatrix[as.matrix(df)]) 
r1 
# 4 x 4 sparse Matrix of class "dgCMatrix" 

#[1,] . 8 . 10 
#[2,] . . . . 
#[3,] . . 59 . 
#[4,] 67 25 100 . 

如果我們需要得到的NA值

(NA^!r1)*r1 
#4 x 4 Matrix of class "dgeMatrix" 
#  [,1] [,2] [,3] [,4] 
#[1,] NA 8 NA 10 
#[2,] NA NA NA NA 
#[3,] NA NA 59 NA 
#[4,] 67 25 100 NA 

這可以通過as.matrix

+0

有沒有必要從名字轉換爲數字,但如果你打算這樣做,「匹配」似乎比regexing更安全。 – Frank

+1

@Frank與另一個答案有一些相似之處,所以我必須刪除直接轉換 – akrun