2016-04-06 3 views
2

Мне нужно суммировать в сгруппированном data_frame (предупреждение: решение с dplyr очень ценится, но не обязательно) и то, и другое в каждой группе (простое) и то же самое на " других "групп.Подведите итоги с помощью dplyr «other then» groups

минимальный пример

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, но я не смог найти решение.

здесь, этот (How to summarize value not matching the group using dplyr) не применяется, поскольку он работает только по сумме, то есть является решением, специфичным для конкретной функции (и с простой арифметической функцией, которая не учитывала изменчивость в каждой группе). Что относительно более сложного запроса функции (т. Е. Mean, sd или user-function)? :-)

Спасибо всем

PS: summarize() пример, тот же вопрос приводит к mutate() или других dplyr-функций рабочего на основе групп.

+0

Вы не можете просто использовать 'library (dplyr)' вместо первых двух строк? –

+0

Если dplyr не установлен в вашей системной библиотеке (dplyr), возвращайте ошибку, поэтому, чтобы быть уверенным, что любой может запустить код, мне пришлось писать 2 строки кода, и я решил использовать pacman вместо этого, что очень полезно пакет в мнении (потому что вы можете загружать (и устанавливать при необходимости) много пакетов одновременно с помощью только двух строк кода) – Corrado

ответ

1

Вот мое решение:

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 

Я пытался придумать все-dplyr решения, но база R Подменит прекрасно работает с median(df$value[df$group != group]) возвращение медианы все наблюдения, которые не входят в текущую группу.

Я надеюсь, что это поможет вам решить вашу проблему.

+0

Извините за поздний ответ.Это на самом деле не очень помогает мне: медиана других медиан, а не другой ценности. поэтому вопросы одинаковы. – Corrado

+0

Предположим, что c-группа c (5, 6, 7). Ваша первая med_other вычислительная медиана (медиана (c (3, 4)), медиана (c (5, 6, 7))), которая отличается от медианной (3, 4, 5, 6, 7) – Corrado

+0

@ Коррадо I адаптировала ответ на вычисление переменной median_other из исходного набора данных, исключая текущую группу – donlelek

2

Я не думаю, что вообще можно выполнять операции над другими группами в пределах summarise() (т. Е. Я думаю, что другие группы не «видны» при суммировании определенной группы). Вы можете определить свои собственные функции и использовать их в мутате, чтобы применить их к определенной переменной. Для вашего обновленного примера вы можете использовать

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 
+0

Этот трюк 'max_other' очень опрятен. Хорошее решение –

+0

О, это очень приятное решение (+1), но подчеркивает непонимание (или плохое объяснение в моем примере). т.е. max определяется для каждой отдельной группы, а max (max (group1), max (group2)) равен max (union (group1, group2)) ... изменение max со средним значением или с sd, может (надеюсь) дать более точное представление о моих вопросах. (Я «должен» использовать всю информацию «других» групп, чтобы отвечать на каждую строку) – Corrado

+0

со средним значением можно принять во внимание толерантность e пересчитать «другие» в среднем по каждой «другой» группе и количество элементов в этой группе ... это еще один плохой пример ... может быть, медиана (или sd, как я только что сказал) может быть хорошим способом решить проблему (если есть такое решение). . Он должен быть функцией множества объединения «других» групп, которым требуется (некоторая) информация этого набора как «одиночный» набор. – Corrado

Смежные вопросы