我希望结合两个嵌套列表。两个列表都包含相同数量的子列表。两个列表中的子列表成对关联,具有相同的索引号,即list1 $' 1'中的值。与list2 $' 1'中的描述相关联。 list1的子列表中的值顺序对应于相同索引号的list2中的子列表中的顺序。我想将这两个列表组合成一个表,所有类别都作为列,子列表索引号作为行。
List1:值
$`1`
[1] "1.0"
$`8`
[1] "1.0"
$`13`
[1] "1.0"
$`2`
[1] "1.0"
$`39`
[1] "6.79E-4" "2.26E-4" "0.99" "1.13E-4"
List2:description
$`1`
[1] "TypeA"
$`8`
[1] "TypeA"
$`13`
[1] "TypeJ"
$`2`
[1] "TypeH"
$`39`
[1] "TypeE" "TypeG" "TypeD" "TypeA"
期望的结果:
No TypeA TypeD TypeE TypeG TypeH TypeJ
1 1.0 0 0 0 0 0
8 1.0 0 0 0 0 0
13 0 0 0 0 0 1.0
2 0 0 0 0 1.0 0
39 1.13E-4 0.99 6.79E-4 2.26E-4 0 0
感谢您的任何建议!
答案 0 :(得分:2)
另一种选择是使用Map
,转换为data.frame
,rbind
list
元素,并使用dcast
转换为' long& #39;广泛的' (来自@ 42-的数据)
library(data.table)
d1 <- rbindlist(Map(data.frame, List1, List2,
names(List1), MoreArgs=list(stringsAsFactors=FALSE)))
setnames(d1, paste0("V", seq_along(d1)))
dcast(d1, V3~V2, value.var="V1", fill=0)
答案 1 :(得分:1)
因为你要传递两个列表&#34;并行&#34;使用mapply
会看到一个可能的选择,但我没有看到一个干净的方法。而是尝试使用for循环来填充具有命名维度的矩阵。这是尚未经过测试的,因为我发现打印输出中的列表重建繁琐,并且同意MrFlick认为这是您的责任:
mtx <- matrix( NA, nrow=length(List1), ncol=length(unique(unlist(List2))), dimnames=list( names(List1), unique(unlist(List2) ) ) )
for (i in seq_along(List1) ){
mtx[ names(List1)[i] , List2[[i]] ] <- List1[[i]] }
#-------
TypeA TypeJ TypeH TypeE TypeG TypeD
1 1.000000 0 0 0.000000 0.000000 0.00
8 1.000000 0 0 0.000000 0.000000 0.00
13 0.000000 1 0 0.000000 0.000000 0.00
2 0.000000 0 1 0.000000 0.000000 0.00
39 0.000113 0 0 0.000679 0.000226 0.99
我最终开始查找the answer to one of my questions on how to convert "scraped" list output to actual R list objects,,虽然现在我看到它为列表名称添加了无关的反向标记,所以我进去并从输入中删除了所有的反引号。)
> dput(List1)
structure(list(`1` = 1, `8` = 1, `13` = 1, `2` = 1, `39` = c(0.000679,
0.000226, 0.99, 0.000113)), .Names = c("1", "8", "13", "2", "39"
))
> dput(List2)
structure(list(`1` = "TypeA", `8` = "TypeA", `13` = "TypeJ",
`2` = "TypeH", `39` = c("TypeE", "TypeG", "TypeD", "TypeA"
)), .Names = c("1", "8", "13", "2", "39"))
(请注意,我认为你错误地构建了你想要的答案。另外我观察到似乎不需要应用于赋值的RHS的as.numeric(),这有点令我感到困惑。)