2014-05-06 69 views
5

假设您有以下两个data.frames:dplyr GROUP_BY和总结了两个DF与相同的列名

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

(注意,这两个DFS有一列名为“X”)

和你要总结DF2 $的z为“X”组中的总额DF1这样的:

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

这将返回错误“无效的索引类型整数”(翻译)。

但是,当我在这两个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具有相同的列名(就像一个“ID”列),这可能是一个问题,除非有一个简单的方法。

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

(两个DFS不必然需要具有相同的独特的 “X” 值在这个例子中)

+0

@阿伦你能证明这将如何在这个例子中工作吗? –

+0

@阿伦谢谢你回答一个例子。这似乎是一个不同的方法很好的解决方案。我想知道是否可能有其他情况(可能在总结功能中更复杂),在这种情况下使用我的问题中指出的方法可能仍然非常有用(但现在我不能拿出一个很好的例子) –

+0

done( https://github.com/hadley/dplyr/issues/417) –

回答

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

你可以试试:

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

心连心