好的,这应该是一个简单的问题,但我正在寻找一个尽可能快的解决方案。
假设我有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
上的表都是聚合的。是否有一个基本的函数来完成这一点,这是我所缺少的?谢谢你的帮忙!
发布于 2015-06-17 05:02:43
我们连接(c
) tab
输出以创建'v1',使用tapply
获取按该对象的names
分组的元素的sum
。
v1 <- c(tab1, tab2, tab3)
tapply(v1, names(v1), FUN=sum)
#1 2 3 4 5
#7 3 4 3 1
发布于 2015-09-17 17:11:00
你可以用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
发布于 2015-06-17 05:01:50
你可以试试这个
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
https://stackoverflow.com/questions/30892120
复制相似问题