【问题标题】:data.table way with .SDcols使用 .SDcols 的 data.table 方式
【发布时间】:2018-03-05 03:11:34
【问题描述】:

我对@9​​87654321@ 有一个问题,请使用.SDcols 进行更改。
这是示例数据:

dt
A   B   C   D
XX  XY  ""  ""
ZZ  ZA  ""  ""

我想要的是使用.SDcols"" 更改为NA

我试过这个:

dt[.SD == "", lapply(.SD, is.na), .SDcols = .(A, B, C, D)]  

但是,我得到了错误。

有什么帮助吗?欣赏。

【问题讨论】:

  • 应该只是dt[, (names(dt)) := lapply(.SD, function(x) {x[x==""] <- NA; x})]
  • fread(..., na.strings=c("", "NA")) 能解决您的问题吗?
  • 或者如果你必须使用.SDcols,那么dt[, (c("A","B","C","D")) := lapply(.SD, function(x) {x[x==""] <- NA; x}), .SDcols=c("A","B","C","D")]
  • @ScottRitchie 实际上,真实数据包含多个列,有些需要"
  • @chinsoon12 还有 replace(x, x=="", NA) 或者如果没有 NA 开头可能是 is.na(x) <- x == ""

标签: r format data.table na


【解决方案1】:

使用来自 Frank 的 cmets 的更强大的方法(处理没有 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

时间上的差异可以忽略不计。当然,您可以根据自己的需要调整参数以找到折衷方案。

【讨论】:

    猜你喜欢
    • 2020-11-21
    • 1970-01-01
    • 2015-09-28
    • 2015-06-16
    • 1970-01-01
    • 2019-02-05
    • 2013-11-17
    • 2018-06-22
    • 1970-01-01
    相关资源
    最近更新 更多