Как group_by () и подмножество в mutate? - PullRequest
2 голосов
/ 28 января 2020

Я ищу способ вычисления двух переменных grouped_by:

 Age <- sample(c("4", "5", "6", "adult"), 20, replace = TRUE)
 letter <- sample(c("a", "c", "d"), 20, replace = TRUE)
 measurement <- sample(1.5:50.5, 20, replace = TRUE)

 df <- data_frame(Age, letter, measurement)

Я хочу указать group_by Возраст и букву

 df2 <- df %>%
     group_by(Age, letter) 

, но затем я хочу вычислить разница между медианным измерением из одного подмножества возраста и другого:

 df2 <- df %>%
     group_by(Age, letter) %>%
     mutate(diff = median(measurement[Age=='adult']) - median(measurement[Age!='adult']))

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

Ответы [ 2 ]

1 голос
/ 11 февраля 2020

Если я правильно понял ваш вопрос, вы хотите вычислить разницу между фиксированным значением (медианой среди взрослых) и значением, которое варьируется в разных группах.

Поскольку кадр данных сгруппирован, вам необходимо использовать исходный кадр данных в исчислении. Кроме того, поскольку вам нужно только одно значение для каждой группы, вы не хотите mutate, а summarise:

df %>%
  group_by(Age, letter) %>%
  summarise(diff = median(measurement) - median(df$measurement[df$Age=='adult'])

В качестве альтернативы, если вы хотите придерживаться конвейера dplyr, вы можете сначала изменить фиктивную переменную, которая содержит медиану, а затем использовать первое вхождение этой переменной в вызове суммирования.

df %>%
  #group_by(letter) %>% #might also be interesting
  mutate(dummy=median(measurement[Age=='adult'])) %>% 
  group_by(Age, letter) %>%
  summarise(diff = median(measurement) - dummy[1]))

Это может быть менее оптимизировано, но позволяет группировать перед вычислением фиксированной медиана, что тоже может быть интересно.

0 голосов
/ 11 февраля 2020

Вы можете сначала рассчитать медиану для взрослых:

adultMedian <- df %>%
    filter(Age == "adult") %>%
    summarise(adultMedian = median(measurement)) %>%
    pull()

df %>%
    group_by(Age, letter) %>%
    mutate(diff = median(measurement) - adultMedian)

Что приводит к

   Age   letter measurement  diff
   <chr> <chr>        <dbl> <dbl>
 1 5     a              9.5 -15  
 2 adult c             24.5  -5  
 3 5     c             12.5 -12  
 4 6     d             18.5   6  
 5 adult a             27.5   3  
 6 adult d             37.5   3.5
 7 4     c             11.5   0.5
 8 6     d             31.5   6  
 9 5     c             32.5 -12  
10 6     c             18.5  -6  
11 5     d             49.5  25  
12 4     d             50.5  26  
13 4     c             38.5   0.5
14 6     d             30.5   6  
15 adult c              4.5  -5  
16 adult c             14.5  -5  
17 5     c              7.5 -12  
18 4     a             24.5   0  
19 adult c             49.5  -5  
20 adult d             18.5   3.5
...