首页 > 解决方案 > dplyr group_by() 和 summarise() 在所选行之间的组内进行计算

问题描述

使用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和不使用行号(例如with and of )summarizemeandispl19992008firstendslice

到目前为止,只有一个汇总变量(但可以有多个),我想出了:

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

但是,我觉得这不是一种整洁的方式。还有其他选项可以编写此代码吗?(不使用行号)。在那种情况下,我使用year但它也可能是一个字符串(所以不minmax解决方案)

谢谢你。

标签: rgroup-bydplyr

解决方案


你可以使用diff

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

如果还有其他年份,我们可以filter针对特定年份,arrange然后再group_by manufacturerdiff

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

推荐阅读