在data.frame&中合并或c * rbind表结果列表。添加缺失值

时间:2016-07-20 14:13:39

标签: r list merge

我的谷歌技术今天没有成功,所以我问了一个新问题:

我有一个值为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,方法是在0NA填充某些插槽中的缺失值,并可选择填写名称。我的目标是使用do.callReduce(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"))

3 个答案:

答案 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