通过引用添加和更新列

在 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 进行数据处理

¡Vamos a practicar!

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

Preparing Video For Download...