我从一个函数中得到了一些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
我的观点是制作一个盒子图。你有什么建议吗?
答案 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.frame
和xtabs
以获得所需的输出。
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
}))