以參照方式新增與更新欄位

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,引入改進:只對被更新的欄位進行深度複製

  • 在下例中,對 df 的操作只會深度複製欄位 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))]

# 只新增單一欄位時,不需要加引號 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...