使用列表中的值填充逻辑矩阵

时间:2017-07-21 08:25:01

标签: r list matrix

我的问题是通过逻辑选择填写值。我有一个矩阵

> 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 个答案:

答案 0 :(得分:3)

您可以将matrix更改为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 ,并在适当的时候替换为矩阵中的值。

$xml = new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8" ' . 'standalone="yes"?><Root/>');

$data->addChild('NAME', $variable);

$dom = new DOMDocument('1.0');
$dom->preserveWhiteSpace = false;     
$dom->formatOutput = true;
$dom->loadXML($xmlAusgabe = $xml->asXML());
$dom->save('../test.xml');

答案 1 :(得分: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

答案 2 :(得分: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])