高级聚合

在 R 中使用 data.table 进行数据处理

Matt Dowle, Arun Srinivasan

Instructors, DataCamp

回顾

# 与前面相同的示例
## LHS := RHS 形式
batrips[, c("is_dur_gt_1hour", "week_day") := 
            .(duration > 3600, wday(start_date)]
# 与上面相同,但使用 `:=`() 函数式写法
batrips[, `:=`(is_dur_gt_1hour = duration > 3600,
               week_day = wday(start_date))]
# 结合 by 的原位更新
batrips[, n_zip_code := .N, by = zip_code]
在 R 中使用 data.table 进行数据处理

按组原位添加多列

# 函数式写法
batrips[, `:=`(end_dur_first = duration[1], 
               end_dur_last  = duration[.N]),
        by = end_station]

# LHS := RHS 写法 batrips[, c("end_dur_first", "end_dur_last") := list(duration[1], duration[.N]), by = end_station]
batrips[1:5]
   trip_id duration ...        end_station ... end_dur_first end_dur_last 
    139545      435 ...    Townsend at 7th ...           435          660
    139546      432 ...    Townsend at 7th ...           435          660
    139547     1523 ...    Beale at Market ...          1523          229
    139549     1620 ... Powell Street BART ...          1620          540
    139550     1617 ... Powell Street BART ...          1620          540
在 R 中使用 data.table 进行数据处理

分箱数值

对于每个唯一的 start_stationend_station 组合,若持续时间的中位数:

  • 小于 600,为"short"
  • 介于 600 到 1800,为"medium"
  • 否则为"long"
在 R 中使用 data.table 进行数据处理

j 中的多行表达式

batrips[, trip_category := {
             med_dur = median(duration, na.rm = TRUE)
             if (med_dur < 600) "short"
             else if (med_dur >= 600 & med_dur <= 1800) "medium"
             else "long"
           },
        by = .(start_station, end_station)]
batrips[1:3]
trip_id duration ... zip_code trip_category
 139545      435 ...    94612         short
 139546      432 ...    94107         short
 139547     1523 ...    94112         short
在 R 中使用 data.table 进行数据处理

另一种方式

bin_median_duration <- function(dur) {
  med_dur <- median(dur, na.rm = TRUE)
  if (med_dur < 600) "short"
  else if (med_dur >= 600 & med_dur <= 1800) "medium"
  else "long"
}

batrips[, trip_category := bin_median_duration(duration), 
           by = .(start_station, end_station)]
在 R 中使用 data.table 进行数据处理

综合运用:i、j 和 by

batrips[duration > 500, min_dur_gt_500 := min(duration), 
           by = .(start_station, end_station)]
batrips[1:3]
trip_id duration ... zip_code min_dur_gt_500
 139545      435 ...    94612             NA
 139546      432 ...    94107             NA
 139547     1523 ...    94112            502
在 R 中使用 data.table 进行数据处理

开始练习吧!

在 R 中使用 data.table 进行数据处理

Preparing Video For Download...