data.table 方式与 .SDcols
data.table way with .SDcols
我有一个关于 data.table
使用 .SDcols
更改的问题。
这是示例数据:
dt
A B C D
XX XY "" ""
ZZ ZA "" ""
我想要的是用.SDcols
把""
改成NA
。
我试过这个:
dt[.SD == "", lapply(.SD, is.na), .SDcols = .(A, B, C, D)]
但是,我遇到了错误。
有什么帮助吗?欣赏。
使用来自 Frank 评论的更强大的方法(处理没有 NA 的情况),下面是一些时间信息。
library(data.table)
library(microbenchmark)
set.seed(6L)
N <- 1e7
numCols <- 100
pctEmpty <- 0.25
ltrs <- sample(LETTERS, N, replace=TRUE)
ltrs[sample(N, pctEmpty*N)] <- ""
dt <- as.data.table(matrix(ltrs, ncol=numCols))
str(dt)
dt1 <- copy(dt)
dt2 <- copy(dt)
microbenchmark(Replace=dt1[, (names(dt1)) := lapply(.SD, function(x) replace(x, x=="", NA_character_)), .SDcols=names(dt1)],
Assign=dt2[, (names(dt2)) := lapply(.SD, function(x) { is.na(x) <- x == ""; x }) , .SDcols=names(dt2)],
times=10L)
# Unit: milliseconds
# expr min lq mean median uq max neval
# Replace 234.0141 240.0262 311.2857 268.2718 401.9364 410.1788 10
# Assign 273.1776 276.4123 344.1861 295.1337 435.8436 449.6495 10
时间上的差异可以忽略不计。当然,您可以根据自己的需要使用参数来权衡取舍。
我有一个关于 data.table
使用 .SDcols
更改的问题。
这是示例数据:
dt
A B C D
XX XY "" ""
ZZ ZA "" ""
我想要的是用.SDcols
把""
改成NA
。
我试过这个:
dt[.SD == "", lapply(.SD, is.na), .SDcols = .(A, B, C, D)]
但是,我遇到了错误。
有什么帮助吗?欣赏。
使用来自 Frank 评论的更强大的方法(处理没有 NA 的情况),下面是一些时间信息。
library(data.table)
library(microbenchmark)
set.seed(6L)
N <- 1e7
numCols <- 100
pctEmpty <- 0.25
ltrs <- sample(LETTERS, N, replace=TRUE)
ltrs[sample(N, pctEmpty*N)] <- ""
dt <- as.data.table(matrix(ltrs, ncol=numCols))
str(dt)
dt1 <- copy(dt)
dt2 <- copy(dt)
microbenchmark(Replace=dt1[, (names(dt1)) := lapply(.SD, function(x) replace(x, x=="", NA_character_)), .SDcols=names(dt1)],
Assign=dt2[, (names(dt2)) := lapply(.SD, function(x) { is.na(x) <- x == ""; x }) , .SDcols=names(dt2)],
times=10L)
# Unit: milliseconds
# expr min lq mean median uq max neval
# Replace 234.0141 240.0262 311.2857 268.2718 401.9364 410.1788 10
# Assign 273.1776 276.4123 344.1861 295.1337 435.8436 449.6495 10
时间上的差异可以忽略不计。当然,您可以根据自己的需要使用参数来权衡取舍。