8

有没有一种简单的方法可以在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]

特别是,这实际上并不比蛮力方法更简单也更容易遵循。

4

3 回答 3

8

另一种使用方式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 
于 2013-05-07T10:20:21.660 回答
1

正如@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.

于 2013-05-07T10:13:00.507 回答
0

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))

对于总结和管道 Vignette 的简要介绍是一个很好的资源:https ://cran.rstudio.com/web/packages/dplyr/vignettes/introduction.html

有关快速使用摘要以进一步发挥最佳效果的方法的更多信息,Markham 的教程非常有帮助:https ://rpubs.com/justmarkham/dplyr-tutorial

于 2016-05-18T23:20:44.603 回答