如何将嵌套列表转换为矩阵,用0填充缺失值

时间:2014-04-08 14:35:05

标签: r

我从一个函数中得到了一些tabled值,它给出了一个像:

这样的列表
> mylist
[[1]]
0 
3 

[[2]]
0 1 
1 3 

[[3]]
1 2 
4 1 

根据这个嵌套列表,我对标签0,标签1和标签2进行了观察,但并非所有列表都包含所有这些标签,因此我想将mylist组织为矩阵,如:

     0  1  2 
[1]  3  0  0
[2]  1  3  0
[3]  0  4  1

我的观点是制作一个盒子图。你有什么建议吗?

2 个答案:

答案 0 :(得分:2)

以下是一些替代方案:

一些样本数据(感谢Gavin Kelly)。

tmp <- list(c(0,0,0), c(0,1,1,1), c(1,1,1,1,2))
lst <- lapply(tmp, table)

基础R方法。在data.frame输出上使用table,然后添加&#34; id&#34;变量,显示它来自哪个列表项。使用do.call(rbind, ...)将其组合为一个较长的data.framextabs以获得所需的输出。

out <- do.call(rbind, lapply(seq_along(lst), function(x) 
  cbind(id = x, data.frame(lst[[x]]))))
out
#   id Var1 Freq
# 1  1    0    3
# 2  2    0    1
# 3  2    1    3
# 4  3    1    4
# 5  3    2    1

xtabs(Freq ~ id + Var1, out)
#    Var1
# id  0 1 2
#   1 3 0 0
#   2 1 3 0
#   3 0 4 1

使用&#34; reshape2&#34;这个过程更加方便。因为melt可以处理list s。

library(reshape2)
melt(lst)
#   Var1 value L1
# 1    0     3  1
# 2    0     1  2
# 3    1     3  2
# 4    1     4  3
# 5    2     1  3

dcast(melt(lst), L1 ~ Var1, fill = 0)
#   L1 0 1 2
# 1  1 3 0 0
# 2  2 1 3 0
# 3  3 0 4 1

答案 1 :(得分:0)

可能不是最优雅的解决方案:

tmp <- list(c(0,0,0), c(0,1,1,1), c(1,1,1,1,2))
lst <- lapply(tmp, table)

nam <- unique(unlist(lapply(lst, names)))
outRow <- rep(0, length(nam))
names(outRow) <- nam

t(sapply(lst, function(x) {out <- outRow;
   out[names(x)] <- x
   out
}))