R 将两个嵌套列表与可变长度的子列表合并
我希望合并两个嵌套列表。两个列表包含相同数量的子列表。两个列表中的子列表成对关联,索引号相同,即list1$'1'中的值与list2$'1'中的描述关联。列表1的子列表中的值的顺序对应于相同索引号的列表2中的子列表中的顺序。我想将这两个列表合并到一个表中,所有类别作为列,子列表索引号作为行 列表1:值R 将两个嵌套列表与可变长度的子列表合并,r,R,我希望合并两个嵌套列表。两个列表包含相同数量的子列表。两个列表中的子列表成对关联,索引号相同,即list1$'1'中的值与list2$'1'中的描述关联。列表1的子列表中的值的顺序对应于相同索引号的列表2中的子列表中的顺序。我想将这两个列表合并到一个表中,所有类别作为列,子列表索引号作为行 列表1:值 $`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.
$`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"
清单2:说明
$`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
谢谢你的建议 因为您使用
mapply“并行”传递两个列表,所以会看到一个可能的选择,但我没有看到一个干净的方法。相反,我们将尝试使用for循环来填充具有命名维度的矩阵。这是尚未测试的,因为我发现从打印输出重建列表很乏味,并且同意Flick先生的观点,这是您的责任:
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
(请注意,我认为您构建的期望答案不正确。我还注意到,应用于作业RHS的as.numeric()似乎不需要,这让我有些困惑)。另一个选项是使用Map
,转换为data.frame
,rbind
列表
元素,并使用dcast将“长”转换为“宽”(数据来自@42-post)
库(data.table)
d1请以更详细的形式提供您的数据(即使用dput()
)
> 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"))
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)