如果表具有不同的长度,如何将几个表中的列的值相加?

时间:2015-06-17 12:49:30

标签: r

好吧,这应该是一个简单的,但我正在寻找尽可能快的解决方案。

我们说我有3个表(表的数量会大得多):

tab1 <- table(c(1, 1, 1, 2, 2, 3, 3, 3))
tab2 <- table(c(1, 1, 4, 4, 4))
tab3 <- table(c(1, 1, 2, 3, 5))

这就是我们得到的:

> tab1
1 2 3 
3 2 3 
> tab2
1 4 
2 3 
> tab3
1 2 3 5 
2 1 1 1 

我希望以快速的方式拥有它以便与许多大表一起使用是:

1 2 3 4 5
7 3 4 3 1

因此,基本上表格会聚合在所有names上。是否有基本功能可以解决这个问题?谢谢你的帮助!

3 个答案:

答案 0 :(得分:12)

我们连接(ctab输出以创建&#39; v1&#39;,使用tapply获取按{0}分组的元素sum该对象的names

v1 <- c(tab1, tab2, tab3)
tapply(v1, names(v1), FUN=sum)
#1 2 3 4 5 
#7 3 4 3 1 

答案 1 :(得分:5)

您可以使用rowsum()。输出与您显示的输出略有不同,但您可以在计算后重新进行重组。 rowsum()已知非常有效。

x <- c(tab1, tab2, tab3)
rowsum(x, names(x))
#   [,1]
# 1    7
# 2    3
# 3    4
# 4    3
# 5    1

以下是添加了akrun的 data.table 建议的基准。

library(microbenchmark)
library(data.table)

xx <- rep(x, 1e5)

microbenchmark(
    tapply = tapply(xx, names(xx), FUN=sum),
    rowsum = rowsum(xx, names(xx)),
    data.table = data.table(xx, names(xx))[, sum(xx), by = V2]
)
# Unit: milliseconds
#        expr       min        lq      mean    median        uq       max neval
#      tapply 150.47532 154.80200 176.22410 159.02577 204.22043 233.34346   100
#      rowsum  41.28635  41.65162  51.85777  43.33885  45.43370 109.91777   100
#  data.table  21.39438  24.73580  35.53500  27.56778  31.93182  92.74386   100

答案 2 :(得分:1)

你可以试试这个

df <- rbind(as.matrix(tab1), as.matrix(tab2), as.matrix(tab3))
aggregate(df, by=list(row.names(df)), FUN=sum)
  Group.1 V1
1       1  7
2       2  3
3       3  4
4       4  3
5       5  1