2017-07-21 22 views
1

我的問題是關於通過邏輯選擇填充值。我有一個矩陣用列表中的值填充邏輯矩陣

> mymat 
       test 
sample  1  2  3  4  5 
    1sample FALSE FALSE TRUE FALSE FALSE 
    2sample FALSE FALSE TRUE TRUE FALSE 
    3sample TRUE FALSE FALSE FALSE FALSE 
    4sample FALSE FALSE FALSE FALSE FALSE 
    5sample FALSE FALSE FALSE FALSE FALSE 

和值

> mylist 
[[1]] 
[1] "a" 

[[2]] 
[1] "b" 

[[3]] 
[1] "c" 

[[4]] 
[1] "d" 

[[5]] 
[1] "e" 

我需要填寫在基質(或創建新的數據結構),其中從第n個列表中的元件匹配到第n列的列表在矩陣中多次作爲行值是true,因此所得到的數據是這樣的:

> mymat 
       test 
sample  1 2 3  4  5 
    1sample <NA> <NA> c <NA> <NA> 
    2sample <NA> <NA> c d <NA> 
    3sample a <NA> <NA> <NA> <NA> 
    4sample <NA> <NA> <NA> <NA> <NA> 
    5sample <NA> <NA> <NA> <NA> <NA> 

回答

3

下面是使用replace

dim<-`(replace(unlist(mylist)[col(mymat)], !mymat, NA), dim(mymat)) 
# [,1] [,2] [,3] [,4] [,5] 
#[1,] NA NA "c" NA NA 
#[2,] NA NA "c" "d" NA 
#[3,] "a" NA NA NA NA 
#[4,] NA NA NA NA NA 
#[5,] NA NA NA NA NA 

或者,如果我們需要利用矩陣索引改變mymat

mymat[] <- replace(unlist(mylist)[col(mymat)], !mymat, NA) 
mymat 
#   test 
#sample 1 2 3 4 5 
# 1sample NA NA "c" NA NA 
# 2sample NA NA "c" "d" NA 
# 3sample "a" NA NA NA NA 
# 4sample NA NA NA NA NA 
# 5sample NA NA NA NA NA 
+1

我知道有辦法用'山坳(mymat)';-)左右(雖然我正在走向一個更簡單的一個;-)) – Cath

+0

秒選項最適合我寧願保持排姓名..謝謝@akrun! – rshraim

3

你可以改變你listmatrix和r在適當的時候用矩陣中的值替換。

mylist_mat <- matrix(rep(unlist(mylist), each=nrow(mymat)), ncol=ncol(mymat)) 
res_mat <- matrix(NA, ncol=ncol(mymat), nrow=nrow(mymat)) 
res_mat[mymat] <- mylist_mat[mymat] 
res_mat 
#  [,1] [,2] [,3] [,4] [,5] 
#[1,] NA NA "c" NA NA 
#[2,] NA NA "c" "d" NA 
#[3,] "a" NA NA NA NA 
#[4,] NA NA NA NA NA 
#[5,] NA NA NA NA NA 
+0

你好嗎我的頭? :P我的唯一區別是'mylist_mat' ..我用'矩陣(不公開(L1),NcoI位= NcoI位(DF)-1,nrow = nrow(DF),byrow = TRUE)':) – Sotos

+0

@Sotos洛爾但我覺得有一個更直接的方式,現在試圖找到它;-)(我感覺第一個「列」是row.names,因爲它應該是一個矩陣,所以只有邏輯: - /) – Cath

+0

右邊...這是有道理的 – Sotos

1

另一種替代的選擇是

# construct matrix of NAs 
myMat2 <- myMat * NA 
# fill in letter values 
myMat2[myMat] <- unlist(mylist)[myMat * col(myMat)] 

數據

myMat <- 
structure(c(FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, 
FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, 
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE), .Dim = c(5L, 
5L)) 
mylist <- as.list(letters[1:5])