2016-03-01 35 views
-3

我期待将两个嵌套列表组合在一起。两个列表都包含相同数量的子列表。两个列表中的子列表都以相同的索引编号成对关联,即列表1中的值'1'与列表2中的描述$'1'相关联。 list1的子列表中的值的顺序对应于具有相同索引编号的列表2中的子列表中的顺序。我想将这两个列表合并到一个表中,其中所有类别均为列,子列表索引编号为行。将两个嵌套列表与varibale长度的子列表组合

列表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.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  

感谢您的咨询!

+2

请提供您的数据以更[可重现格式](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)(即使用'dput()') – MrFlick

回答

1

由于您使用mapply“并行”传递两个列表会看到一个可能的选择,但我没有看到一个干净的方法。相反,会尝试使用for-loop来填充具有命名维度的矩阵。因为我发现名单重建从打印输出繁琐与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, -ticks到列表中的名字,所以我去了,并从输入删除了所有的反引号)。

> 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")) 

(请注意,我想你错误组建所需的答案。我也观察到as.numeric()适用于任务的RHS似乎并不需要,在一定程度上我的困惑)。

2

另一种选择是使用Map,转换为data.framerbindlist元素,并使用dcast从“长”转换为“宽”(数据来自@ 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

F **王优雅! –