2014-05-06 35 views
5

giả sử bạn có hai data.frames sau:dplyr group_by và tóm tắt cho hai của df với cùng tên cột

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

(lưu ý rằng cả dfs đã một cột có tên là "x")

và bạn muốn tóm tắt tổng của df2 $ z cho các nhóm "x" trong df1 như sau:

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

điều này trả về lỗi "số nguyên chỉ số không hợp lệ" (đã dịch).

Nhưng khi tôi thay đổi tên của cột "x" trong bất kỳ một trong hai dfs, nó hoạt động:

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 

tôi có thể tưởng tượng nhiều tình huống, nơi bạn có hai dfs với tên cùng một cột (giống như cột "ID"), đây có thể là vấn đề, trừ khi có một cách đơn giản xung quanh nó.

Tôi đã bỏ lỡ điều gì đó? Có thể có những cách khác để có được kết quả tương tự cho ví dụ này nhưng tôi quan tâm đến sự hiểu biết nếu điều này là có thể trong dplyr (hoặc có lẽ tại sao không).

(hai dfs không nhất thiết cần phải có cùng độc đáo "x" giá trị như trong ví dụ này)

+0

@Arun bạn có thể chứng minh thế nào điều này sẽ làm việc trong ví dụ? –

+0

@Arun cảm ơn bạn đã trả lời bằng ví dụ. điều này có vẻ là một giải pháp tốt với cách tiếp cận khác. tôi tự hỏi liệu có thể có trường hợp khác (có thể phức tạp hơn trong chức năng tóm tắt) trong đó có thể vẫn rất hữu ích khi sử dụng cách tiếp cận như được nêu trong câu hỏi của tôi (nhưng bây giờ tôi không thể đưa ra một ví dụ rõ ràng) –

+0

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

Trả lời

2

Tiếp theo bình luận từ @ mới bắt đầu, tôi đoán nó muốn được một cái gì đó như:

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

bạn có thể thử:

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

hth

Các vấn đề liên quan