R:用前一个和后一个非缺失数据的平均值插补缺失数据
假设数据如下所示:R:用前一个和后一个非缺失数据的平均值插补缺失数据,r,R,假设数据如下所示: df <- data.frame(ID=1:6, Value=c(NA, 1, NA, NA, 2, NA)) df ID Value 1 1 NA 2 2 1 3 3 NA 4 4 NA 5 5 2 6 6 NA 更具体地说,我想用前一个和后一个非缺失数据的平均值来插补缺失数据,如果只有前一个或后一个非缺失数据存在,用这个非缺失数据插补。未定义缺少所有数据的行为 我怎样才能在R中做到这一点?这应该可以 for(
df <- data.frame(ID=1:6, Value=c(NA, 1, NA, NA, 2, NA))
df
ID Value
1 1 NA
2 2 1
3 3 NA
4 4 NA
5 5 2
6 6 NA
更具体地说,我想用前一个和后一个非缺失数据的平均值来插补缺失数据,如果只有前一个或后一个非缺失数据存在,用这个非缺失数据插补。未定义缺少所有数据的行为
我怎样才能在R中做到这一点?这应该可以
for( i in 1:nrow(df)){
if(is.na(df$Value[i])){
df$Value[i] <- mean(df$Value[1:i])
}
}
for(1中的i:nrow(df)){
if(is.na(df$Value[i])){
df$Value[i]看看approxfun
和rule=2
的设计。这并不完全是您所要求的(因为它在NA间隙之间进行线性插值,而不是替换间隙端点的平均值),但它可能是可以接受的:
> approxfun(df$ID, df$Value, rule=2)(df$ID)
[1] 1.000000 1.000000 1.333333 1.666667 2.000000 2.000000
使用rule=2
时,它在极端情况下的行为符合您的要求。zoo软件包中还有na.approx
方法
我要提醒大家,不要将这些数据用于任何进一步的统计推断。这种插补方法本质上是说,在不进行测量的时期内,不存在随机变化的可能性,而且世界通常不那么一致。向前和向后使用na.locf
并取其平均值:
library(zoo)
both <- cbind( na.locf(df$Value, na.rm = FALSE),
na.locf(df$Value, na.rm = FALSE, fromLast = TRUE))
transform(df, Value = rowMeans(both, na.rm = TRUE))
这似乎就是您要寻找的:imputeTS::interpolation和zoo::appro可能值得一看,以获得与请求的解决方案类似的解决方案(实际上不是100%的请求结果)
library(zoo)
both <- cbind( na.locf(df$Value, na.rm = FALSE),
na.locf(df$Value, na.rm = FALSE, fromLast = TRUE))
transform(df, Value = rowMeans(both, na.rm = TRUE))
ID Value
1 1 1.0
2 2 1.0
3 3 1.5
4 4 1.5
5 5 2.0
6 6 2.0