В этом сообщении в блоге Пол Хиемстра показывает, как суммировать два столбца с помощью dplyr::mutate_
. Копирование/вставка соответствующих частей:
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))
}
позволяет выполнить следующее:
head(f('wt', 'mpg', 'hahaaa'))
Отлично!
Я рассмотрел вопрос (см. комментарии) о том, как можно распространить это на 100 столбцов, так как было не совсем ясно (мне), как это можно сделать, не набирая все имена, используя выше способ. Пол был достаточно любезен, чтобы побаловать меня и предоставил этот ответ (спасибо!):
# 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)])
Я бы хотел улучшить этот ответ по этим вопросам:
-
Остальные столбцы исчезли. Я хотел бы сохранить их.
-
Он использует
rowSums()
, который должен принуждать data.frame к матрице, которую я бы хотел избежать.Также я не уверен, что рекомендуется использовать
.
в пределахdo()
глаголов? Поскольку.
внутриmutate()
, похоже, не подходит для этих строк при использовании сgroup_by()
. -
И самое главное, как я могу сделать то же самое с помощью
mutate_()
вместоmutate()
?
Я нашел этот ответ, который касается пункта 1, но, к сожалению, оба ответа dplyr
используют rowSums()
вместе с mutate()
.
PS: Я просто прочитал комментарий Хэдли под этим ответом. IIUC, "изменить форму на длинную форму + группу на + сумма + изменить на широкую форму" является рекомендуемым способом dplyr
для этих типов операций?