是否有一种简单的方法可以在 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))
),
我想要的只是取表t1
和t2
并加上他们(通常非常大)的数量......我可以用几种非常笨重的方式来做。
然而,这似乎应该是非常普遍且非常容易解决的
问题(实际上,我认为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 :(得分: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
答案 1 :(得分: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
。
答案 2 :(得分: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