2017-07-21 21 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])