【问题标题】:Replace NAs with 0 in all numeric columns using data.table in R [duplicate]使用 R 中的 data.table 将所有数字列中的 NA 替换为 0 [重复]
【发布时间】:2017-10-27 05:53:42
【问题描述】:

我想编写代码,使用 data.table 语法将所有数字列中的 NA 替换为 0。

我的代码如下:

dt <- data.table(a = c(1:3,NA, NA, NA, 10:12 ), b = c(NA, NA, NA, 20:25), c = c(letters[1 : 7], NA, NA) )

> dt
    a  b  c
1:  1 NA  a
2:  2 NA  b
3:  3 NA  c
4: NA 20  d
5: NA 21  e
6: NA 22  f
7: 10 23  g
8: 11 24 NA
9: 12 25 NA


needed_names <- names(dt)[sapply(dt, is.numeric)]

dt_ <- dt[, lapply(.SD, function(x){if(is.na(x)) 0 else x}), .SDcols = needed_names] 

> dt_
    a b
1:  1 0
2:  2 0
3:  3 0
4: NA 0
5: NA 0
6: NA 0
7: 10 0
8: 11 0
9: 12 0

您能告诉我为什么我的代码不工作以及我应该如何纠正它吗?

您的建议将不胜感激。

【问题讨论】:

    标签: r if-statement data.table lapply na


    【解决方案1】:

    或者:

    num_cols <- sapply(dt, is.numeric)
    dt2 <- dt[,num_cols,with=F]
    dt <- cbind(dt[,!num_cols, with=F],dt2)
    

    【讨论】:

      【解决方案2】:

      我们可以通过循环遍历数字列 (needed_names) 和 seti 中指定的 NA 元素到 0 来使用 set 来实现这一点

      for(j in needed_names){
         set(dt, i = which(is.na(dt[[j]])), j=j, value = 0)
      }
      dt
      #    a  b  c
      #1:  1  0  a
      #2:  2  0  b
      #3:  3  0  c
      #4:  0 20  d
      #5:  0 21  e
      #6:  0 22  f
      #7: 10 23  g
      #8: 11 24 NA
      #9: 12 25 NA
      

      关于 OP 的代码,当有多个元素时,我们使用 ifelsereplace 并且输出应分配回感兴趣的列,否则,我们将只指定 @987654328 中指定的列@并且不会在原始数据集中更新

      dt[, (needed_names) := lapply(.SD, function(x) 
                replace(x, is.na(x), 0)), .SDcols = needed_names] 
      

      【讨论】:

        猜你喜欢
        • 2020-09-13
        • 2016-09-20
        • 1970-01-01
        • 2020-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-21
        • 2020-11-19
        相关资源
        最近更新 更多