【问题标题】:Replacing NA's iteratively using data table in 'R'使用“R”中的数据表迭代替换 NA
【发布时间】:2014-02-09 18:13:28
【问题描述】:

我正在尝试用来自适当组的随机样本替换 NA。例如,在第 2 行中,NA 来自“France”,年龄和时间为“20-30”“30-40”。因此,我想对所有其他 'France'、'20-30'、'30-40' 观察结果的 Response 列进行随机抽样。

下面的代码效果很好,但每个值都被相同的随机样本替换。例如,如果我有多个 'France'、'20-30'、'30-40' NA,它们对应的 R2 将是相同的。

我希望对每个 NA 进行独立采样,但 data.table 似乎是“一次性”完成的,因此我不能这样做。有什么想法吗?

DT <- data.table(mydf, key = "Country,Age,Time")
DT[, R2 := ifelse(is.na(Response), sample(na.omit(Response), 1), 
                  Response), by = key(DT)]
DT
#    Index Country   Age  Time Response R2
# 1:     5  France 20-30 30-40        1  1
# 2:     6  France 20-30 30-40       NA  2
# 3:     7  France 20-30 30-40        2  2
# 4:     1 Germany 20-30 15-20        1  1
# 5:     2 Germany 20-30 15-20       NA  1
# 6:     3 Germany 20-30 15-20        1  1
# 7:     4 Germany 20-30 15-20        0  0

mydf 在哪里

mydf <- structure(list(Index = 1:7, Country = c("Germany", "Germany", 
"Germany", "Germany", "France", "France", "France"), Age = c("20-30", 
"20-30", "20-30", "20-30", "20-30", "20-30", "20-30"), Time = c("15-20", 
"15-20", "15-20", "15-20", "30-40", "30-40", "30-40"), Response = c(1L, 
NA, 1L, 0L, 1L, NA, 2L)), .Names = c("Index", "Country", "Age", 
"Time", "Response"), class = "data.frame", row.names = c(NA, -7L))

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    我会这样做:

    DT[, is_na := is.na(Response)]
    nas <- DT[, sample(Response[!is_na], sum(is_na), TRUE) ,
                 by=list(Country, Age, Time)]$V1
    DT[, R2 := Response][(is_na), R2 := nas]
    

    【讨论】:

      【解决方案2】:
      set.seed(1234)
      require(data.table)
      DT <- data.table(mydf, key = "Country,Age,Time")
      

      第一步

      DT[, R2 := sample(na.omit(Response), length(Response), replace = T), 
         by = key(DT)]
      
      DT
      
      #    Index Country   Age  Time Response R2
      # 1:     5  France 20-30 30-40        1  1
      # 2:     6  France 20-30 30-40       NA  2
      # 3:     7  France 20-30 30-40        2  2
      # 4:     1 Germany 20-30 15-20        1  1
      # 5:     2 Germany 20-30 15-20       NA  0
      # 6:     3 Germany 20-30 15-20        1  1
      # 7:     4 Germany 20-30 15-20        0  1
      

      编辑

      第二步

      在第一步中,您对跨组进行采样(按 = ...)并获得 R2 的值。 第二步,使用没有 NA 的响应值更新 R2。

      DT[!is.na(Response), R2 := Response]
      
      DT
      
      #    Index Country   Age  Time Response R2
      # 1:     5  France 20-30 30-40        1  1
      # 2:     6  France 20-30 30-40       NA  2
      # 3:     7  France 20-30 30-40        2  2
      # 4:     1 Germany 20-30 15-20        1  1
      # 5:     2 Germany 20-30 15-20       NA  0
      # 6:     3 Germany 20-30 15-20        1  1
      # 7:     4 Germany 20-30 15-20        0  0
      

      【讨论】:

      • 我不确定,但我认为随机抽样应该只替换 NA 条目......例如:R2 的最后一个值应该仍然是 0,只是 NA 可能是 0/1。
      • 这不可能真的是正确的,因为正如 Arun 指出的那样,第 7 行中的最后一个值已经改变了。
      • 嗯,这是一个跨组的示例,也许您可​​以这样做,然后从 R2 的响应中更新非 NA 值。我已经编辑了答案。希望这会有所帮助!
      • @user3154267 如果我是你,我会接受阿伦斯的回答。我相信他的回答更好。
      猜你喜欢
      • 2022-01-03
      • 1970-01-01
      • 1970-01-01
      • 2021-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-27
      • 1970-01-01
      相关资源
      最近更新 更多