【问题标题】:replace NAs in a column of a data.table with means of the same column grouped by a factor用按因子分组的同一列的平均值替换 data.table 列中的 NA
【发布时间】:2017-06-05 12:31:09
【问题描述】:

我有以下示例数据表

steps.dt = data.table(steps=rep(0:2, each=3), 
date=as.factor(rep(c("10/2/2012", "10/3/2012", "10/4/2012"), each = 3)), interval = as.factor(rep(c(0,5,10), each = 3)))

插入一些 NA

steps.dt[c(2,5,8),"steps"]=NA

表格现在看起来像这样

   steps      date interval
1:     0 10/2/2012        0
2:    NA 10/2/2012        0
3:     0 10/2/2012        0
4:     1 10/3/2012        5
5:    NA 10/3/2012        5
6:     1 10/3/2012        5
7:     2 10/4/2012       10
8:    NA 10/4/2012       10
9:     2 10/4/2012       10

现在,我正在尝试将“步骤”列中的 NA 替换为按“间隔”因子分组的步骤方法

我查看了 SO 上的一些帖子,例如 this,但我需要按一个因素对替换进行分组,这使得它变得复杂。有没有办法在不使用循环的情况下做到这一点?谢谢!

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    我们可以使用zoo中的na.aggregate将'NA'替换为'间隔'分组后'步骤'的mean

    library(zoo)
    steps.dt[, steps := na.aggregate(steps), interval]
    

    【讨论】:

      【解决方案2】:

      使用 dplyr 的解决方案

      library(dplyr)
      steps.dt = steps.dt %>% group_by(interval) %>% 
                              mutate(steps = ifelse(is.na(steps),mean(steps,na.rm = T),steps))
      

      【讨论】:

      • 仅供参考,您可以改为 replace(steps, is.na(steps), mean(steps, na.rm=TRUE))
      • @Frank 但他需要将其按“间隔”分组。一个简单的替换将 NA 替换为步数的总体平均值
      • 当然,我的意思是你可以使用它而不是 ifelse 部分(保留 group_by)。 ifelse 函数通常有一些怪癖和速度问题,当目标是替换某些值时,这似乎不是最自然的选择。
      猜你喜欢
      • 1970-01-01
      • 2016-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-13
      • 2016-12-31
      • 2012-03-08
      相关资源
      最近更新 更多