dplyr group_by并汇总两个具有相同列名的df

时间:2014-05-06 18:43:07

标签: r dataframe dplyr

假设您有以下两个data.frames:

set.seed(1)
x <- letters[1:10]
df1 <- data.frame(x)
z <- rnorm(20,100,10)
df2 <- data.frame(x,z)

(请注意,两个dfs都有一个名为&#34; x&#34;)的列

并且您想要总结df2 $ z的总和为&#34; x&#34;在df1中像这样:

df1 %.%
  group_by(x) %.%
  summarize(
    z = sum(df2$z[df2$x == x]) 
   )

这会返回错误&#34;无效的索引类型整数&#34; (翻译)。

但是当我更改列的名称&#34; x&#34;在两个dfs中的任何一个中,它都有效:

df2 <- data.frame(x1 = x,z) #column is now named "x1", it would also work if the name was changed in df1

df1 %.%
   group_by(x) %.%
   summarize(
     z = sum(df2$z[df2$x1 == x]) 
   )

#   x        z
#1  a 208.8533
#2  b 205.7349
#3  c 185.4313
#4  d 193.8058
#5  e 214.5444
#6  f 191.3460
#7  g 204.7124
#8  h 216.8216
#9  i 213.9700
#10 j 202.8851

我可以想象很多情况,你有两个具有相同列名的dfs(比如&#34; ID&#34;列),这可能是一个问题,除非有一个简单的方法。

我错过了什么吗?对于这个例子,可能还有其他方法可以获得相同的结果,但我有兴趣了解dplyr中是否可以这样做(或者为什么不这样做)。

(两个dfs不一定需要具有相同的唯一&#34; x&#34;值,如本示例所示)

2 个答案:

答案 0 :(得分:2)

根据@beginneR的评论,我猜它会像:

inner_join(df1, df2) %.% group_by(x) %.% summarise(z=sum(z))

Joining by: "x"
Source: local data frame [10 x 2]

   x        z
1  a 208.8533
2  b 205.7349
3  c 185.4313
4  d 193.8058
5  e 214.5444
6  f 191.3460
7  g 204.7124
8  h 216.8216
9  i 213.9700
10 j 202.8851

答案 1 :(得分:1)

你可以尝试:

df2%.%filter(x%in%df1$x)%.%group_by(x)%.%summarise(sum(z))

HTH