Вот еще один вариант с использованием синтаксиса tidyverse
library(tidyverse)
df1 %>%
select(matches("AUS")) %>%
reduce(`+`) %>%
mutate(df1, AUS_sum = .)
# VAR1 VAR2 AUS1 AUS2 AUS3 AUS4 AUS56 VAR3 VAR4 AUS_sum
#1 A D 23 234 34 856 99 0 FCK 1246
#2 B D 55 76 55 36 6456 0 XYC 6678
В версии для разработки dplyr
(скоро будет выпущена 0.6.0
) мы можем создать функцию с quosures
и сделать ее более динамичной. Здесь enquo
выполняет те же функции, что и substitute
из base R
, беря входные аргументы и преобразовывая их в quosure
, с quo_name
мы преобразуем его в строку, где matches
принимает строковый аргумент. Имя левой стороны также может быть создано как строка («newN»), и внутри mutate/summarise/group_by
мы раскавычиваем (!!
или UQ
) для оценки строки.
fSum <- function(dat, pat){
pat <- quo_name(enquo(pat))
newN <- paste0(pat, "_sum")
newSum <- dat %>%
select(matches(pat)) %>%
reduce(`+`)
dat %>%
mutate(!!newN := newSum)
}
fSum(df1, AUS)
# VAR1 VAR2 AUS1 AUS2 AUS3 AUS4 AUS56 VAR3 VAR4 AUS_sum
#1 A D 23 234 34 856 99 0 FCK 1246
#2 B D 55 76 55 36 6456 0 XYC 6678
Основываясь на комментарии OP к другому сообщению об удалении столбцов, которые использовались для sum
, мы можем изменить функцию
fSumN <- function(dat, pat){
pat <- quo_name(enquo(pat))
newN <- paste0(pat, "_sum")
newSum <- dat %>%
select(matches(pat)) %>%
reduce(`+`)
dat %>%
select(-matches(pat)) %>%
mutate(!!newN := newSum)
}
fSumN(df1, AUS)
# VAR1 VAR2 VAR3 VAR4 AUS_sum
#1 A D 0 FCK 1246
#2 B D 0 XYC 6678
данные
df1 <- structure(list(VAR1 = c("A", "B"), VAR2 = c("D", "D"), AUS1 = c(23L,
55L), AUS2 = c(234L, 76L), AUS3 = c(34L, 55L), AUS4 = c(856L,
36L), AUS56 = c(99L, 6456L), VAR3 = c(0L, 0L), VAR4 = c("FCK",
"XYC")), .Names = c("VAR1", "VAR2", "AUS1", "AUS2", "AUS3", "AUS4",
"AUS56", "VAR3", "VAR4"), class = "data.frame", row.names = c(NA,
-2L))
person
akrun
schedule
20.04.2017
AUS
— это один столбец, а число, следующее за ним, — это другой столбец. Тогда вы легко совместите самые традиционные глаголыdplyr
, такие какgroup_by
иsummarise
. - person liborm   schedule 20.04.2017