【问题标题】:Replace NAs with zeros in a subset of columns in a data.table [duplicate]在data.table的列子集中用零替换NA [重复]
【发布时间】:2017-10-31 04:24:24
【问题描述】:

给定这个data.table:

library(data.table)
aa <- data.table(a = c(1, 2, 3), b = c(1, 2, NA), c = c(NA, 2, 3))

cols = c("b")
aa[, (cols) := {dt <- .SD; dt[is.na(dt)] <- 0; dt}, .SDcols = cols]

我觉得我的方式不是很干净,必须有一种更具可读性的方式。谢谢!

[编辑]

我的第一个例子不是很好,这里有一个更好的:

library(data.table)
aa <- data.table(a = c(1, 2, 3), b = c(1, 2, NA), c = c(NA, 2, 3), d = c(1, NA, 3))

我需要替换任意一组列中的 NA,例如bc。这意味着我不能使用i,因为那里不允许使用矩阵。

【问题讨论】:

  • 必须是data.table吗? aa$b[is.na(aa$b)] &lt;- 0 或类似的是否足够好?
  • @Phil,是的,它必须是 data.table。列向量是一些任意字符向量。在示例中,我使用b,但它可以是任何一组列。
  • 这是可读的,但我不知道效率...apply(aa,c(1,2),function(x){if(is.na(x)) 0 else x})
  • 糟糕,我看错了你,你希望能够选择一个子集

标签: r data.table


【解决方案1】:

可能这对于 data.table aa[is.na(b), b := 0] 来说更干净

[编辑]

我会这样写,但不确定这是否比你的更具可读性。

cols = c("b", "c")
aa[, (cols) := lapply(.SD, function(x){x[is.na(x)] <- 0; x}), .SDcols = cols]

[编辑]

如果您想将此应用于一系列列,您可以使用子集

cols <- colnames(subset(aa, select=b:c))
aa[, (cols) := lapply(.SD, function(x){x[is.na(x)] <- 0; x}), .SDcols = cols]

【讨论】:

  • 好吧,我不认为我举了一个很好的例子。让我更新一下问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-15
  • 2019-11-05
  • 2017-04-30
  • 2021-10-22
  • 1970-01-01
  • 1970-01-01
  • 2017-10-27
相关资源
最近更新 更多