In this blog post, Paul Hiemstra cho biết cách tổng hợp hai cột bằng cách sử dụng dplyr::mutate_
. Sao chép/dán-ing bộ phận liên quan:Sử dụng 'mutate_' để tổng hợp một loạt các cột hàng khôn ngoan
library(lazyeval)
f = function(col1, col2, new_col_name) {
mutate_call = lazyeval::interp(~ a + b, a = as.name(col1), b = as.name(col2))
mtcars %>% mutate_(.dots = setNames(list(mutate_call), new_col_name))
}
cho phép một để rồi thực hiện:
head(f('wt', 'mpg', 'hahaaa'))
Tuyệt vời!
Tôi tiếp tục với câu hỏi (xem nhận xét) về cách có thể mở rộng cột này thành 100 cột, vì nó không rõ ràng (đối với tôi) cách người ta có thể thực hiện mà không phải nhập tất cả tên phương pháp trên. Paul đã được loại, đủ để thưởng thức tôi và cung cấp câu trả lời này (cảm ơn!):
# data
df = data.frame(matrix(1:100, 10, 10))
names(df) = LETTERS[1:10]
# answer
sum_all_rows = function(list_of_cols) {
summarise_calls = sapply(list_of_cols, function(col) {
lazyeval::interp(~col_name, col_name = as.name(col))
})
df %>% select_(.dots = summarise_calls) %>% mutate(ans1 = rowSums(.))
}
sum_all_rows(LETTERS[sample(1:10, 5)])
Tôi muốn cải thiện câu trả lời này trên những điểm sau:
Các cột khác đã mất hết. Tôi muốn giữ chúng.
Nó sử dụng
rowSums()
trong đó có cưỡng chế data.frame để một ma trận mà tôi muốn tránh.Ngoài ra tôi không chắc liệu việc sử dụng các cú pháp
.
trong vòng khôngdo()
được khuyến khích hay không? Vì.
trong phạm vimutate()
dường như không thích ứng với chỉ những hàng khi được sử dụng vớigroup_by()
.Và quan trọng nhất, làm cách nào để tôi có thể thực hiện tương tự bằng cách sử dụng
mutate_()
thay vìmutate()
?
tôi thấy this answer, vốn là biểu điểm 1, nhưng không may, cả hai dplyr
câu trả lời sử dụng rowSums()
cùng với mutate()
.
PS: Tôi vừa đọc Hadley's comment under that answer. IIUC, 'định dạng lại thành dạng dài + nhóm bằng + tổng + định dạng lại thành dạng rộng' là cách giới thiệu dplyr
cho các loại hoạt động này?
Không cần cho 'thư viện (lazyeval)' khi bạn rõ ràng đủ điều kiện sử dụng của nó anyway. –