于 2015 年 11 月 24 日完全重写,以修复以前版本中的错误。
还在 2019 年 9 月 27 日添加了更多现代选项
你有几个选择。
使用嵌入式调用处理所有目标列
lapply(),使用:= 将修改后的值分配到位。这
依赖于 := 非常方便的支持同时分配到其 LHS 上命名的多个列。
使用for 循环逐个遍历目标列,
使用set()依次修改每一个的值。
使用for 循环迭代多个“幼稚”调用
到[.data.table(),每一个都修改一个列。
这些方法似乎都一样快,所以你使用哪一种
主要是口味问题。 (1) 非常紧凑,并且
富有表现力。这是我最常使用的,虽然你可能会发现 (2)
更容易阅读。因为它们一次处理和修改一个列,所以 (2) 或 (3) 在您的 data.table 非常大以至于您有遇到限制的危险的罕见情况下将具有优势
由 R 会话的可用内存强加。
library(data.table)
## Create three identical 1000000-by-20 data.tables
DT1 <- data.table(1:1e6,
as.data.table(replicate(1e6, paste(sample(letters, nr, TRUE),
sample(letters, nr, TRUE)))))
cnames <- c("ID", paste0("X", 1:19))
setnames(DT1, cnames)
DT2 <- copy(DT1); DT3 <- copy(DT1)
## Method 1
system.time({
DT1[, .SDcols=cnames[-1L], cnames[-1L] :=
lapply(.SD, function(x) gsub(" ", "_", x, fixed=TRUE)), ]
})
## user system elapsed
## 10.90 0.11 11.06
## Method 2
system.time({
for(cname in cnames[-1]) {
set(DT2, j=cname, value=gsub(" ", "_", DT2[[cname]], fixed=TRUE))
}
})
## user system elapsed
## 10.65 0.05 10.70
## Method 3
system.time({
for(cname in cnames[-1]) {
DT3[ , (cname) := gsub(" ", "_", get(cname), fixed=TRUE)]
}
})
## user system elapsed
## 10.33 0.03 10.37
有关set() 和:= 的更多详细信息,请阅读他们的帮助页面,通过键入?set 或?":=" 获得。