【问题标题】:replacing all NA with a 0 in data.table in R用R中的data.table中的0替换所有NA
【发布时间】:2020-09-13 16:30:13
【问题描述】:

我有一个data.table 有很多列。有 4 列我想用 0 替换 NA

我有一个可行的解决方案:

  claimsMonthly[is.na(claim9month),claim9month := 0
          ][is.na(claim10month),claim10month := 0
            ][is.na(claim11month),claim11month := 0
              ][is.na(claim12month),claim12month := 0]

但是,这是相当重复的,我想通过使用循环来减少这种情况(但不确定这是否是最聪明的想法?):

  for (i in 9:12){
    claimsMonthly[is.na(paste0("claim", i, "month")), paste0("claim", i, "month") := 0]
  }

当我运行这个循环时,什么也没有发生。我想这是由于paste0() 返回"claim12month" 的约定,所以我得到in.na("claim12month")。结果是FALSE,尽管我的数据中有NA。我猜这与引号有关?

这不是我第一次遇到使用paste0() 或使用data.table 运行循环的问题,所以我必须在这里遗漏一些重要的东西。

任何想法如何解决这个问题?

【问题讨论】:

    标签: r loops data.table


    【解决方案1】:

    我们可以使用列名 ('nm1') 指定 .SDcols,循环遍历 .SD(Data.table 的子集)并将 NA 分配为 0(replace_na from tidyr )

    library(data.table)
    library(tidyr)
    nm1 <- paste0("claim", 9:12, "month")
    setDT(claimsMonthly)[, (nm1) := lapply(.SD, replace_na, 0), .SDcols = nm1]
    

    或者正如@jangorecki在cmets中提到的那样,data.table中的nafill会更好

    setDT(claimsMonthly)[, (nm1) := lapply(.SD, nafill, fill = 0), .SDcols = nm1]
    

    或使用带有set 的循环,通过指定i(用于行索引)和j 用于列索引/名称,根据每列中的NA 值将感兴趣的列分配为0

    for(j in nm1){
        set(claimsMonthly, i = which(is.na(claimsMonthly[[j]])), j =j, value = 0)
     }
    

    或者setnafill

    setnafill(claimsMonthly, cols = nm1, fill = 0)
    

    【讨论】:

    • 请注意,setnafill 消除了对 [ 的需求,并将副本数量减少到零
    • 两者都将并行计算列
    • @jangorecki 当然,我会的。让我先从头开始尝试,看看我是否无法自己解决:=)
    【解决方案2】:

    你可以使用:

    claimsMonthly[, 9:12][is.na(claimsMonthly[, 9:12])] <- 0
    

    你也可以使用变量名:

    claimsMonthly[c("claim9month", "claim10month","claim11month","claim12month")][is.na(claimsMonthly[c("claim9month", "claim10month","claim11month","claim12month")])] <- 0
    

    或者更好的是,您可以使用带有“claimXXmonth”模式的所有变量的向量。

    【讨论】:

      猜你喜欢
      • 2017-10-27
      • 2015-10-09
      • 2021-10-22
      • 2021-11-26
      • 1970-01-01
      • 2021-07-02
      • 2016-09-20
      • 1970-01-01
      • 2012-06-17
      相关资源
      最近更新 更多