2016-04-11 18 views
10

Khi sử dụng "group_by" và "mutate" của dplyr, nếu tôi hiểu chính xác, khung dữ liệu được chia thành các phân đoạn phụ khác nhau theo đối số group_by. Ví dụ, với đoạn mã sau:dplyr group_by và mutate, cách truy cập vào khung dữ liệu

set.seed(7) 
df <- data.frame(x=runif(10),let=rep(letters[1:5],each=2)) 
df %>% group_by(let) %>% mutate(mean.by.letter = mean(x)) 

bình() được áp dụng liên tiếp đến cột x 5 tiểu dfs tương ứng với một lá thư giữa một & e.

Vì vậy, bạn có thể thao tác các cột của các phần phụ nhưng bạn có thể truy cập vào các phần phụ không? Trước sự ngạc nhiên của tôi, nếu tôi thử:

set.seed(7) 
data <- data.frame(x=runif(10),let=rep(letters[1:5],each=2)) 
data %>% group_by(let) %>% mutate(mean.by.letter = mean(.$x)) 

kết quả khác. Từ kết quả này, người ta có thể phỏng đoán rằng "." df không đại diện liên tiếp các dfs phụ nhưng chỉ là dữ liệu "dữ liệu" (chức năng group_by không thay đổi bất kỳ thứ gì).
Lý do là tôi muốn sử dụng chức năng stat lấy khung dữ liệu làm đối số trên từng phần phụ này. Cảm ơn!

+0

Bạn có thể thử với '? Do' – akrun

+1

'do.call (rbind, lapply (split (df, df $ để cho), myfun))' – Frank

+0

I don' t hiểu câu hỏi vì câu trả lời được chấp nhận tạo ra giống như 'data%>% group_by (let)%>% mutate (mean.by.letter = mean (x))' (trừ khi tôi thiếu một cái gì đó) nhưng có thể chậm hơn vì thêm 'do'-call –

Trả lời

7

Chúng ta có thể sử dụng trong vòng do

data %>% 
    group_by(let) %>% 
    do(mutate(., mean.by.letter = mean(.$x))) 
+0

@Franck: Cảm ơn Akrun & Frank, nó hoạt động tốt! Tôi đã sử dụng chức năng "làm" trong giải pháp của tôi nhưng không phải là một biến thể và những gì đã mất tích! Tôi phải nói rằng tôi hơi bối rối bởi "lý do". Bạn có biết bất kỳ bài báo/sách nâng cao nào về cách mọi thứ hoạt động đằng sau hiện trường không? Bạn có lời giải thích nào không? – godot

+0

@godot nó cần một đầu ra data.frame trong 'do'. Vì vậy, nếu bạn không sử dụng 'mutate', nó cần một cuộc gọi' data.frame' rõ ràng bên trong 'do', nhưng nó sẽ chỉ cung cấp cho bạn một giá trị duy nhất cho mỗi nhóm, tức là tóm tắt .. – akrun

+0

Cảm ơn. Trên thực tế, nó không phải là phần 'do()' mà tôi không hiểu, đó là phần "dấu chấm" trong hàm 'mutate()' của ví dụ đầu tiên của tôi: làm thế nào đến _ đầu ra của group_by (do đó là ". "của' mutate') là cùng một data.frame như input_ của nó? Và làm thế nào 'nghĩa()' "biết" rằng var x là cột của các phụ-dfs và không phải là chính? – godot

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