Agrégations avancées

Manipulation de données avec data.table en R

Matt Dowle, Arun Srinivasan

Instructors, DataCamp

Résumé

# Même exemple que précédemment
## Forme LHS := RHS
batrips[, c("is_dur_gt_1hour", "week_day") := 
            .(duration > 3600, wday(start_date)]
# Idem ci-dessus, mais en forme fonctionnelle `:=`()
batrips[, `:=`(is_dur_gt_1hour = duration > 3600,
               week_day = wday(start_date))]
# Mise à jour par référence avec by
batrips[, n_zip_code := .N, by = zip_code]
Manipulation de données avec data.table en R

Ajouter plusieurs colonnes par référence, par groupe

# Forme fonctionnelle
batrips[, `:=`(end_dur_first = duration[1], 
               end_dur_last  = duration[.N]),
        by = end_station]

# Forme 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
Manipulation de données avec data.table en R

Regrouper des valeurs en classes

Pour chaque combinaison unique de start_station et end_station, si la durée médiane est :

  • inférieure à 600, « short »
  • entre 600 et 1800, « medium »
  • sinon, « long »
Manipulation de données avec data.table en R

Expressions multilignes dans 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
Manipulation de données avec data.table en R

Autre approche

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)]
Manipulation de données avec data.table en R

Tout ensemble : i, j et 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
Manipulation de données avec data.table en R

Passons à la pratique !

Manipulation de données avec data.table en R

Preparing Video For Download...