r - 如何用中位数填充NA?

标签 r plyr data.table statistics

示例数据:

set.seed(1)
df <- data.frame(years=sort(rep(2005:2010, 12)), 
                 months=1:12, 
                 value=c(rnorm(60),NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA))

head(df)
  years months      value
1  2005      1 -0.6264538
2  2005      2  0.1836433
3  2005      3 -0.8356286
4  2005      4  1.5952808
5  2005      5  0.3295078
6  2005      6 -0.8204684

请告诉我,我如何将 df$value 中的 NA 替换为其他月份的中位数? “值”必须包含同月所有先前值的中值。也就是说,如果当前月份是 5 月,则“值”必须包含 5 月份之前所有值的中值。

最佳答案

你要使用测试is.na功能:

df$value[is.na(df$value)] <- median(df$value, na.rm=TRUE)

这表示所有值,其中 df$valueNA ,将其替换为右侧。您需要 na.rm=TRUE件,否则 median函数将返回 NA
按月做这个月,有很多选择,但我想plyr有最简单的语法:
library(plyr)
ddply(df, 
      .(months), 
      transform, 
      value=ifelse(is.na(value), median(value, na.rm=TRUE), value))

您也可以使用 data.table .如果您的数据很大,这是一个特别好的选择:
library(data.table)
DT <- data.table(df)
setkey(DT, months)

DT[,value := ifelse(is.na(value), median(value, na.rm=TRUE), value), by=months]

还有很多其他的方法,但有两种!

关于r - 如何用中位数填充NA?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11971876/

相关文章:

r - 分组相关矩阵

r - 数据框中的 Colmeans 按因子变量

r - 将列表字符串向量解析为多列 data.table

r - 聚合和 DCast

R strsplit 不会在 "."上拆分?

r - 从 dlply 内部调用 lm 抛出 "0 (non-NA) cases"错误 [r]

r - 提取在两个或多个字段中具有重复值但在另一个字段中具有不同值的行

r - R中两个数据表之间按行计算匹配元素

r - 获取与行长度不均匀的条件匹配的数据帧行

r - 使用 dplyr 和 tidyverse 通过时间汇总总和