Подведите итог с dplyr "другие тогда" группы
Мне нужно суммировать данные в сгруппированном data_frame (предупреждаю: решение с dplyr очень ценится, но не является обязательным) и что-то в каждой группе (простое), и то же самое в "других" группах.
минимальный пример
if(!require(pacman)) install.packages(pacman)
pacman::p_load(dplyr)
df <- data_frame(
group = c('a', 'a', 'b', 'b', 'c', 'c'),
value = c(1, 2, 3, 4, 5, 6)
)
res <- df %>%
group_by(group) %>%
summarize(
median = median(value)
# median_other = ... ??? ... # I need the median of all "other"
# groups
# median_before = ... ??? ... # I need the median of groups (e.g
# the "before" in alphabetic order,
# but clearly every roule which is
# a "selection function" depending
# on the actual group is fine)
)
мой ожидаемый результат заключается в следующем
group median median_other median_before
a 1.5 4.5 NA
b 3.5 3.5 1.5
c 5.5 2.5 2.5
Я искал в Google строки, похожие на "dplyr итог без учета групп", "dplyr итог других, чем группа", я искал в документации по dplyr, но не смог найти решение.
здесь это ( Как суммировать значение, не совпадающее с группой, используя dplyr) не применяется, потому что оно работает только на сумму, то есть является решением, "зависящим от функции" (и с простой арифметической функцией, которая не учитывает изменчивость в каждой группе)). Как насчет более сложного запроса функции (то есть mean, sd или user-function)?:-)
Спасибо всем
PS: summarize()
пример, тот же вопрос приводит к mutate()
или другие dplyr-функции, работающие на основе групп.
2 ответа
Вот мое решение:
res <- df %>%
group_by(group) %>%
summarise(med_group = median(value),
med_other = (median(df$value[df$group != group]))) %>%
mutate(med_before = lag(med_group))
> res
Source: local data frame [3 x 4]
group med_group med_other med_before
(chr) (dbl) (dbl) (dbl)
1 a 1.5 4.5 NA
2 b 3.5 3.5 1.5
3 c 5.5 2.5 3.5
Я пытался придумать решение all-dplyr, но подмножество base R прекрасно работает с median(df$value[df$group != group])
возвращает медиану всех наблюдений, которых нет в текущей группе.
Я надеюсь, что это поможет вам решить вашу проблему.
Я не думаю, что вообще возможно выполнять операции над другими группами в пределах summarise()
(т.е. я думаю, что другие группы не "видны" при обобщении определенной группы). Вы можете определить свои собственные функции и использовать их в mutate, чтобы применить их к определенной переменной. Для вашего обновленного примера вы можете использовать
calc_med_other <- function(x) sapply(seq_along(x), function(i) median(x[-i]))
calc_med_before <- function(x) sapply(seq_along(x), function(i) ifelse(i == 1, NA, median(x[seq(i - 1)])))
df %>%
group_by(group) %>%
summarize(med = median(value)) %>%
mutate(
med_other = calc_med_other(med),
med_before = calc_med_before(med)
)
# group med med_other med_before
# (chr) (dbl) (dbl) (dbl)
#1 a 1.5 4.5 NA
#2 b 3.5 3.5 1.5
#3 c 5.5 2.5 2.5