我的谷歌技术今天没有成功,所以我问了一个新问题:
我有一个值为c(0, 2, 3)
的矩阵:
> a
1 2 3 4 5 6 7 8 9 10
1 2 2 2 2 3 3 3 3 2 2
2 2 2 2 2 3 3 3 3 2 2
3 0 2 2 2 2 2 2 2 0 2
4 0 2 2 2 2 2 2 2 0 2
5 2 2 2 2 3 3 3 3 2 2
6 2 2 2 2 2 2 2 2 2 2
7 2 2 2 2 2 2 2 2 2 2
8 2 2 2 2 2 2 2 2 2 2
9 2 2 2 2 3 3 3 3 2 2
10 2 2 2 2 2 2 2 2 2 2
我使用apply
res <- apply(a, 1, table)
res[1:3]
[[1]]
2 3
6 4
[[2]]
2 3
6 4
[[3]]
0 2
2 8
现在,我尝试将列表合并到一个data.frame,方法是在0
或NA
填充某些插槽中的缺失值,并可选择填写名称。我的目标是使用do.call
或Reduce(function(...) merge(..., all=TRUE), res)
之类的简单函数。但这两种方法都不起作用。
预期输出为:
final[1:3, ]
0 2 3
[1,] 0 6 4
[2,] 0 6 0
[3,] 2 8 8
和数据:
structure(list(`1` = c(2, 2, 0, 0, 2, 2, 2, 2, 2, 2), `2` = c(2,
2, 2, 2, 2, 2, 2, 2, 2, 2), `3` = c(2, 2, 2, 2, 2, 2, 2, 2, 2,
2), `4` = c(2, 2, 2, 2, 2, 2, 2, 2, 2, 2), `5` = c(3, 3, 2, 2,
3, 2, 2, 2, 3, 2), `6` = c(3, 3, 2, 2, 3, 2, 2, 2, 3, 2), `7` = c(3,
3, 2, 2, 3, 2, 2, 2, 3, 2), `8` = c(3, 3, 2, 2, 3, 2, 2, 2, 3,
2), `9` = c(2, 2, 0, 0, 2, 2, 2, 2, 2, 2), `10` = c(2, 2, 2,
2, 2, 2, 2, 2, 2, 2)), row.names = c(NA, -10L), class = "data.frame", .Names = c("1",
"2", "3", "4", "5", "6", "7", "8", "9", "10"))
答案 0 :(得分:2)
您可以使用smartbind
包中的gtools
:
library(gtools)
do.call(smartbind, c(apply(a, 1, table), fill = 0)) # fill by 0's, default is NA
# 2 3 0
#1 6 4 0
#2 6 4 0
#3 8 0 2
#4 ...
答案 1 :(得分:1)
另一种选择是在调用table之前定义完整级别:
res <- apply(a, 1, function(x){x<-factor(x ,levels=c(0,2,3)) ; table(x) } )
as.data.frame(t(res))
# 0 2 3
#[1,] 0 6 4
#[2,] 0 6 4
#[3,] 2 8 0
答案 2 :(得分:0)
以下是使用base R
table(rep(1:nrow(a), ncol(a)), unlist(a))
# 0 2 3
# 1 0 6 4
# 2 0 6 4
# 3 2 8 0
# 4 2 8 0
# 5 0 6 4
# 6 0 10 0
# 7 0 10 0
# 8 0 10 0
# 9 0 6 4
# 10 0 10 0