data.table方式与.SDcols

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了data.table方式与.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的主要内容,如果未能解决你的问题,请参考以下文章

rollapplyr()仅创建一个新列,而不为.SDcols中的每一列创建多个列

data.table中的R rowsum崩溃R.

r 将函数应用于.SDcols和分组依据

与 data.table 合并数据以重复唯一值

R data.table 合并/完全外连接与 na.fill / nomatch 基于公式

用data.table进行矩阵操作,规范不正确?