示例数据:
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$value
是 NA
,将其替换为右侧。您需要 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/