2014-05-06 98 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)) 

心連心