将两个嵌套列表与varibale长度的子列表组合在一起

时间:2016-03-01 20:45:20

标签: r

我希望结合两个嵌套列表。两个列表都包含相同数量的子列表。两个列表中的子列表成对关联,具有相同的索引号,即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      

感谢您的任何建议!

2 个答案:

答案 0 :(得分:2)

另一种选择是使用Map,转换为data.framerbind 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(),这有点令我感到困惑。)