【发布时间】:2012-10-15 13:59:01
【问题描述】:
我认为这会有一个简单的答案,但我无法解决!以下是使用iris 数据集的示例:
a <- table(iris[,2])
b <- table(iris[,3])
如何将这两个表加在一起?例如,在新的输出表中,变量 3 的值为 27 (26+1),变量 3.3 的值为 8 (6+2)。
非常感谢任何帮助。
【问题讨论】:
我认为这会有一个简单的答案,但我无法解决!以下是使用iris 数据集的示例:
a <- table(iris[,2])
b <- table(iris[,3])
如何将这两个表加在一起?例如,在新的输出表中,变量 3 的值为 27 (26+1),变量 3.3 的值为 8 (6+2)。
非常感谢任何帮助。
【问题讨论】:
如果您想使用a 和b 中都存在的变量,这将起作用:
n <- intersect(names(a), names(b))
a[n] + b[n]
# 3 3.3 3.5 3.6 3.7 3.8 3.9 4 4.1 4.2 4.4
# 27 8 8 5 4 7 5 6 4 5 5
如果要使用所有变量:
n <- intersect(names(a), names(b))
res <- c(a[!(names(a) %in% n)], b[!(names(b) %in% n)], a[n] + b[n])
res[order(names(res))] # sort the results
【讨论】:
iris 示例,[-n] 似乎无效。
temp<-merge(a,b,by='Var1')
temp$sum<-temp$Freq.x + temp$Freq.y
Var1 Freq.x Freq.y sum
1 3 26 1 27
2 3.3 6 2 8
3 3.5 6 2 8
4 3.6 4 1 5
5 3.7 3 1 4
6 3.8 6 1 7
7 3.9 2 3 5
8 4 1 5 6
9 4.1 1 3 4
10 4.2 1 4 5
11 4.4 1 4 5
【讨论】:
这是另一个:
transform(merge(a,b, by="Var1"), sum=Freq.x + Freq.y)
Var1 Freq.x Freq.y sum
1 3 26 1 27
2 3.3 6 2 8
3 3.5 6 2 8
4 3.6 4 1 5
5 3.7 3 1 4
6 3.8 6 1 7
7 3.9 2 3 5
8 4 1 5 6
9 4.1 1 3 4
10 4.2 1 4 5
11 4.4 1 4 5
【讨论】:
这是merge() 解决方案的一个稍微有点折磨的单行版本:
do.call(function(Var1, Freq.x, Freq.y) data.frame(Var1=Var1, Freq=rowSums(cbind(Freq.x, Freq.y))), merge(a, b, by="Var1"))
如果你想使用所有变量,这里是一个:
do.call(function(Var1, Freq.x, Freq.y) data.frame(Var1=Var1, Freq=rowSums(cbind(Freq.x, Freq.y), na.rm=TRUE)), merge(a, b, by="Var1", all=TRUE))
与transform() 单行不同,它不会累积 .x 和 .y,因此可以迭代使用。
【讨论】:
data.table包的合并功能可能是你想要的:https://rpubs.com/ronasta/join_data_tables
【讨论】: