在R中“添加”两个大表的简单方法是什么?

问题描述:

R中有没有简单的方法来为两个大表中的每个类别添加计数?在R中“添加”两个大表的简单方法是什么?

...其中的表并不都具有完全相同存在相同的值(虽然他们大多会重叠):

的什么,我试图做的小例子。设置一些数据:

x1 <- c(5, 3, 3, 6, 3, 3, 5, 5, 11, 2, 4, 9, 3, 5, 8, 2, 8, 5, 4, 8) 
    x2 <- c(6, 10, 9, 17, 6, 7, 8, 11, 5, 12, 14, 5, 11, 7, 7) 

    table(x1) 
x1 
2 3 4 5 6 8 9 11 
2 5 2 5 1 3 1 1 

table(x2) 
x2 
5 6 7 8 9 10 11 12 14 17 
2 2 3 1 1 1 2 1 1 1 

现在我想这些表结合起来,就好像我做了table(c(x1,x2)),越来越:

2 3 4 5 6 7 8 9 10 11 12 14 17 
2 5 2 7 3 3 4 2 1 3 1 1 1 

但现在想象x1和x2都走了(并且是真正的大,所以我真的 想从表中重新创建它们和真正做table(c(x1,x2))), 我要的是把表t1t2和添加他们(通常很大)计算......我可以做几个真笨重的方式。

然而,这似乎像它应该是既非常普遍,非常易于解决 问题(事实上,我估计t1 + t2应该为表与同类型的类别 工作),但搜索的每一个搜索项问题我可以认为 没有找到任何东西。

我错过了一个非常简单明显的方法来做到这一点?

编辑:

为了澄清,这样的事情(我做到了)不是什么必须 与表一个非常常见的操作“简单而明显”:

m <- merge(t1,t2,by.x="x1",by.y="x2",all=TRUE) 
m[is.na(m)] <- 0 
oo <- order(m$x1) 
t12 <- m[oo,2]+m[oo,3] 
names(t12) <- m[oo,1] 

特别是这比暴力方法更简单也更容易遵循。

+0

你应该看看' merge'。 – 2013-05-07 10:00:01

+0

@PaulHiemstra我在发布之前做过。我也玩了很长时间。我没有看到一个很好的方式去做我想做的事情(比通过暴力做事更容易)。我可能错过了那里的一些东西,但在那种情况下......我需要更多的暗示。 – 2013-05-07 10:05:19

+1

如果你使用数据框而不是表格,你的生活会容易得多。表格只是有名的向量,一般而言,用于对齐和组合已命名的向量的R函数很少,而数据帧则有很多。 – hadley 2013-05-07 12:35:46

使用tapply另一种方式:

tapply(c(t1,t2), names(c(t1,t2)), sum) 
# 10 11 12 14 17 2 3 4 5 6 7 8 9 
# 1 3 1 1 1 2 5 2 7 3 3 4 2 

这里的,如果你想要一个有序输出:

w <- c(t1,t2) 
# edit: Following G.Grothendieck's suggestion to simplify it further 
tapply(w, as.numeric(names(w)), sum) 
# 2 3 4 5 6 7 8 9 10 11 12 14 17 
# 2 5 2 7 3 3 4 2 1 3 1 1 1 
+0

+1好主意,正在寻找这样的东西。 – juba 2013-05-07 10:21:56

+0

啊,整齐。是的,需要排序输出。第二种方式将很好地延伸到许多表格。 – 2013-05-07 10:26:21

由于@PaulHiemstra说,merge应该做的工作。我不是太熟悉,但是这个代码应该工作(尽管可能有更有效的方式来做到这一点...)

x1 <- c(5, 3, 3, 6, 3, 3, 5, 5, 11, 2, 4, 9, 3, 5, 8, 2, 8, 5, 4, 8) 
x2 <- c(6, 10, 9, 17, 6, 7, 8, 11, 5, 12, 14, 5, 11, 7, 7) 

tx1 <- table(x1) 
tx2 <- table(x2) 

df1 <- data.frame(names=names(tx1),values=as.vector(tx1)) 
df2 <- data.frame(names=names(tx2),values=as.vector(tx2)) 

mdf12 <- merge(df1,df2,by="names",all=TRUE) 
mdf12[is.na(mdf12)] <- 0 

counts <- mdf12[,2] + mdf12[,3] 
names(counts) <- mdf12[,1] 

counts[order(as.numeric(names(counts)))] 
table(c(x1,x2)) 

我不喜欢is.na一步,但我不知道如何要做到这一点,首先有0而不是NA

+0

谢谢,是的,我确实做了一些非常接近于此的事情,但是对于必须对桌面进行非常频繁的操作来说,它似乎非常复杂。 – 2013-05-07 10:19:35

+0

好的,对不起,然后把它。也许我可以稍后删除这篇文章,因为您在编辑帖子时已经尝试过这种复杂的解决方案,并且@Arun发布了一个合适的解决方案(+1)。 – 2013-05-07 10:26:37

+0

这里的错是我的;你的答案涵盖了*一种方式来做到这一点,并在没有我后来编辑的信息是一个合理的答案。我已经相应地投了票。 – 2013-05-07 11:04:14

dplyr

library(dplyr) 
x1 <- c(5, 3, 3, 6, 3, 3, 5, 5, 11, 2, 4, 9, 3, 5, 8, 2, 8, 5, 4, 8) 
x2 <- c(6, 10, 9, 17, 6, 7, 8, 11, 5, 12, 14, 5, 11, 7, 7) 

# Transform "Tables" to DataFrames & standardize column names 
df1 <- as.data.frame(table(x1)) %>% select(x = x1, Freq) 
df2 <- as.data.frame(table(x2)) %>% select(x = x2, Freq) 

# Merge tables & aggregate results 
Ttldf <- bind_rows(df1, df2) %>% group_by(x) %>% summarise(TtlFreq = sum(Freq)) 

对于一个良好的,简洁的INT roduction来总结和管道暗角是一个很好的资源:https://cran.rstudio.com/web/packages/dplyr/vignettes/introduction.html

有关如何快速使用总结更多的信息,以进一步最好的效果,Markham的教程是非常有帮助的:https://rpubs.com/justmarkham/dplyr-tutorial