Додавання та оновлення стовпців за посиланням

Опрацювання даних із data.table в R

Matt Dowle, Arun Srinivasan

Instructors, DataCamp

Внутрішній устрій data.frame

Припустімо, ви хочете змінити 2-й рядок стовпця "y" на 10

df <- data.frame(x = 1:5, y = 6:10)
df
x  y
1  6
2  7
df$y[2] <- 10
Опрацювання даних із data.table в R

Внутрішній устрій data.frame

У R < v3.1.0 ця операція призводила до глибокого копіювання всього data.frame

# що відбувається всередині до R v3.1.0
tmp <- <deep copy of "df">
tmp$y[2] <- 10
df <- tmp
  • Що станеться, якщо зробити те саме для data.frame на 10 ГБ?
Опрацювання даних із data.table в R

Внутрішній устрій data.frame

  • У v3.1.0 поліпшено так, що глибоко копіюється лише оновлюваний стовпець

  • У цьому прикладі лише стовпці a та b глибоко копіюються під час операції над df нижче

df <- data.frame(a = 1:3, b = 4:6, c = 7:9, d = 10:12)
df[1:2] <- lapply(df[1:2], function(x) ifelse(x%%2, x, NA))
df
 a  b c  d
 1 NA 7 10
NA  5 8 11
 3 NA 9 12
Опрацювання даних із data.table в R

Внутрішній устрій data.table

  • data.table оновлює стовпці на місці, тобто за посиланням

  • Це означає, що не потрібно присвоювати результат назад змінній

  • Під час зміни значень копії жодного стовпця не створюються

  • data.table використовує новий оператор := для додавання/оновлення/видалення стовпців за посиланням

Опрацювання даних із data.table в R

Форма LHS := RHS

batrips[, c("is_dur_gt_1hour", "week_day") := list(duration > 3600, 
                                                   wday(start_date))]

# Коли додаєте один стовпець, лапки не потрібні batrips[, is_dur_gt_1hour := duration > 3600]
Опрацювання даних із data.table в R

Функціональна форма

batrips[, `:=`(is_dur_gt_1hour = NULL,                  
               start_station = toupper(start_station))] 
Опрацювання даних із data.table в R

Давайте потренуємось!

Опрацювання даних із data.table в R

Preparing Video For Download...