我的问题是通过逻辑选择填写值。我有一个矩阵
> 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>
答案 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])