分组求和

王致远

2019/03/04

今天下午在做数据预处理时,碰到了去年此时难到我的一个问题——将不同车道号或上下行方向的交通流量相加。我当时的解法很笨很粗暴,这次寻求更加简单的解决方案。

head(jd201610)
##   station_index station_name   date CDH SX timestamp volume
## 1 S01L001520111     桐木岭站 Sep-19  12  S       279    0.0
## 2 S01L001520111     桐木岭站 Sep-19  31  X       279    2.0
## 3 S01L001520111     桐木岭站 Sep-19  32  X       279    4.0
## 4 G75L197520322   松坎观测站 Sep-19  11  S       279   19.5
## 5 G75L197520322   松坎观测站 Sep-19  12  S       279    4.5
## 6 G75L197520322   松坎观测站 Sep-19  31  X       279    4.5
names(jd201610)
## [1] "station_index" "station_name"  "date"          "CDH"          
## [5] "SX"            "timestamp"     "volume"

现在要将同一个交调站,日期和时间戳的交通流相加,也就是说要将不同的CDH和上下行的交通流相加。其使用dplyr::summarise就可以很方便的解决了。

groups <- group_by(jd201610,station_name,date,timestamp)
jd201610tt <- summarise(groups,ttvolume = sum(volume,na.rm = T))
head(jd201610tt,10)
## # A tibble: 10 x 4
## # Groups:   station_name, date [1]
##    station_name date   timestamp ttvolume
##    <chr>        <chr>      <int>    <dbl>
##  1 丙妹         Oct-01         1      5  
##  2 丙妹         Oct-01         2      6  
##  3 丙妹         Oct-01         3      2.5
##  4 丙妹         Oct-01         4      1  
##  5 丙妹         Oct-01         5      3  
##  6 丙妹         Oct-01         6      2  
##  7 丙妹         Oct-01         7     12  
##  8 丙妹         Oct-01         8      2.5
##  9 丙妹         Oct-01         9      5.5
## 10 丙妹         Oct-01        10      1

如果要分上下行,那么把上下行变量也加入分组里

groups <- group_by(jd201610,station_name,date,timestamp,SX)
jd201610tt <- summarise(groups,ttvolume = sum(volume,na.rm = T))
head(jd201610tt,10)
## # A tibble: 10 x 5
## # Groups:   station_name, date, timestamp [5]
##    station_name date   timestamp SX    ttvolume
##    <chr>        <chr>      <int> <chr>    <dbl>
##  1 丙妹         Oct-01         1 S          5  
##  2 丙妹         Oct-01         1 X          0  
##  3 丙妹         Oct-01         2 S          6  
##  4 丙妹         Oct-01         2 X          0  
##  5 丙妹         Oct-01         3 S          2.5
##  6 丙妹         Oct-01         3 X          0  
##  7 丙妹         Oct-01         4 S          1  
##  8 丙妹         Oct-01         4 X          0  
##  9 丙妹         Oct-01         5 S          3  
## 10 丙妹         Oct-01         5 X          0

非常漂亮地解决了该问题。