Подведите итог с 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
Другие вопросы по тегам