dplyr group_by () и sumrize () для вычисления внутри групп между выбранными строками - PullRequest
0 голосов
/ 05 февраля 2020

Используя данные mpg для получения базового примера:

dat <- mpg %>% 
select(manufacturer, year, displ) %>% 
group_by(manufacturer, year) %>% 
summarise(meandispl = mean(displ)) %>% 
ungroup()

# A tibble: 30 x 3
# Groups:   manufacturer [15]
   manufacturer  year meandispl
   <chr>        <int>     <dbl>
 1 audi          1999      2.36
 2 audi          2008      2.73
 3 chevrolet     1999      4.97
 4 chevrolet     2008      5.12
 5 dodge         1999      4.32
 6 dodge         2008      4.42
 7 ford          1999      4.45
 8 ford          2008      4.66
 9 honda         1999      1.6 
10 honda         2008      1.85

С этими данными я бы хотел group_by manufacturer и summarize сравнить meandispl между 1999 и 2008 без использования номеров строк (например, с first и end из slice)

Пока что только для одной обобщенной переменной (но может быть несколько) я придумал :

dat %>% 
group_by(manufacturer) %>%
summarise(diff2008_1999 = meandispl[which(year == 2008)] - meandispl[which(year == 1999)]) 

Однако я чувствую, что это не совсем правильный способ. Есть ли другие варианты, чтобы написать этот код? (без использования номера строки). В этом случае я использовал year, но это также может быть строка (так что нет решения min, max)

Спасибо.

Ответы [ 2 ]

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

Как уже предположил Ронак Шах, лучший воспроизводимый минимальный пример того, что вы хотите, облегчил бы вам задачу ...

В любом случае, вот еще одно предложение использовать pivot_wider для обозначения каждого года значения в свои столбцы

dat %>% 
  pivot_wider(names_from = year,
              values_from = meandispl,
              names_prefix = "year_") %>% 
  mutate(diff_2008_1999 = year_2008 - year_1999)
0 голосов
/ 05 февраля 2020

Вы можете использовать diff

library(dplyr)
dat %>% group_by(manufacturer) %>%  summarise(diff = diff(meandispl))

Если есть и другие годы, мы можем filter для определенных c лет, arrange их, а затем group_by manufacturer и возьми diff.

dat %>% 
  filter(year %in% c(1999, 2008)) %>% 
  arrange(manufacturer, year) %>%
  group_by(manufacturer) %>%  
  summarise(diff = diff(meandispl))
...