Как сообщить group_by
для группировки данных по всем столбцам, кроме одного?
С aggregate
это будет aggregate(x ~ ., ...)
.
Я попробовал group_by(data, -x)
, но это группы по отрицанию-x (то есть, как и группировка по x).
Как сообщить group_by
для группировки данных по всем столбцам, кроме одного?
С aggregate
это будет aggregate(x ~ ., ...)
.
Я попробовал group_by(data, -x)
, но это группы по отрицанию-x (то есть, как и группировка по x).
Вы можете сделать это, используя стандартную оценку (group_by_
вместо group_by
):
# Fake data
set.seed(492)
dat = data.frame(value=rnorm(1000), g1=sample(LETTERS,1000,replace=TRUE),
g2=sample(letters,1000,replace=TRUE), g3=sample(1:10, replace=TRUE),
other=sample(c("red","green","black"),1000,replace=TRUE))
dat %>% group_by_(.dots=names(dat)[-grep("value", names(dat))]) %>%
summarise(meanValue=mean(value))
g1 g2 g3 other meanValue <fctr> <fctr> <int> <fctr> <dbl> 1 A a 2 green 0.89281475 2 A b 2 red -0.03558775 3 A b 5 black -1.79184218 4 A c 10 black 0.17518610 5 A e 5 black 0.25830392 ...
Смотрите эту виньетку для получения дополнительной информации о стандартной и нестандартной оценке в dplyr
.
dplyr
0.7.0Чтобы отправить комментарий @ÖmerAn: похоже, что group_by_at
- это путь dplyr
0.7.0 (кто-то, пожалуйста, исправьте меня, если я ошибаюсь в этом). Например:
dat %>%
group_by_at(names(dat)[-grep("value", names(dat))]) %>%
summarise(meanValue=mean(value))
# Groups: g1, g2, g3 [?] g1 g2 g3 other meanValue <fctr> <fctr> <int> <fctr> <dbl> 1 A a 2 green 0.89281475 2 A b 2 red -0.03558775 3 A b 5 black -1.79184218 4 A c 10 black 0.17518610 5 A e 5 black 0.25830392 6 A e 5 red -0.81879788 7 A e 7 green 0.30836054 8 A f 2 green 0.05537047 9 A g 1 black 1.00156405 10 A g 10 black 1.26884303 # ... with 949 more rows
Пусть оба метода дают один и тот же результат (в dplyr
0.7.0):
new = dat %>%
group_by_at(names(dat)[-grep("value", names(dat))]) %>%
summarise(meanValue=mean(value))
old = dat %>%
group_by_(.dots=names(dat)[-grep("value", names(dat))]) %>%
summarise(meanValue=mean(value))
identical(old, new)
# [1] TRUE
Основываясь на редактировании @eipi10 dplyr 0.7.0, group_by_at
представляется правильной функцией для этого задания. Однако, если вы просто хотите исключить столбец "x", вы можете использовать:
new2.0 <- dat %>%
group_by_at(vars(-x)) %>%
summarize(mean_value = mean(value))
Использование данных примера @eipi10:
# Fake data
set.seed(492)
dat <- data.frame(value = rnorm(1000),
g1 = sample(LETTERS, 1000, replace = TRUE),
g2 = sample(letters, 1000, replace = TRUE),
g3 = sample(1:10, replace = TRUE),
other = sample(c("red", "green", "black"), 1000, replace = TRUE))
new <- dat %>%
group_by_at(names(dat)[-grep("value", names(dat))]) %>%
summarise(meanValue = mean(value))
new2.0 <- dat %>%
group_by_at(vars(-value)) %>%
summarize(meanValue = mean(value))
identical(new, new2.0)
# [1] TRUE