参照による列の追加と更新

R の data.table によるデータ操作

Matt Dowle, Arun Srinivasan

Instructors, DataCamp

data.frameの内部動作

列「y」の2行目を10に変更する例です

df <- data.frame(x = 1:5, y = 6:10)
df
x  y
1  6
2  7
df$y[2] <- 10
R の data.table によるデータ操作

data.frameの内部動作

R v3.1.0未満では、この操作によりdata.frame全体がディープコピーされました

# R v3.1.0以前の内部動作
tmp <- <deep copy of "df">
tmp$y[2] <- 10
df <- tmp
  • 10GBのdata.frameで同じ操作を行うとどうなるでしょうか?
R の data.table によるデータ操作

data.frameの内部動作

  • v3.1.0では、更新対象の列のみをディープコピーするよう改善されました

  • 以下の操作では、ab のみがディープコピーされます

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
R の data.table によるデータ操作

data.tableの内部動作

  • data.table は列をその場で、すなわち参照によって更新します

  • 結果を変数に再代入する必要はありません

  • 値の変更中に列のコピーは作成されません

  • data.table:= 演算子を使用して、列を参照によって追加・更新・削除します

R の data.table によるデータ操作

LHS := RHS 形式

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

# 列を1つ追加する場合、引用符は不要です batrips[, is_dur_gt_1hour := duration > 3600]
R の data.table によるデータ操作

関数形式

batrips[, `:=`(is_dur_gt_1hour = NULL,                  
               start_station = toupper(start_station))] 
R の data.table によるデータ操作

練習しましょう!

R の data.table によるデータ操作

Preparing Video For Download...