用下一个非 NA 值的平均值替换 NA
Replacing NAs with mean of next non-NA value
我得到了一个 data.frame 每小时值。有时我会错过几个小时的值,并想用第一个非缺失值除以缺失值的计数+1(非缺失值也是其中的一部分:
即(非常简化的版本)
c(1,NA,NA,NA,4,NA,2,1)
我想要的是:
c(1,(4/4),(4/4),(4/4),(4/4),(2/2),(2/2),1)
这将是:
c(1,1,1,1,1,1,1,1,1)
目前我使用带有 na.locf 的动物园,它将所有 NA 替换为第一个非 na:对于我们的示例,这意味着:
c(1,4,4,4,4,2,2,1)
谢谢
您需要合并 na.locf
和 rle
:
library(zoo)
ifelse(is.na(x) | is.na(c(0, head(x,-1))),
with(rle(na.locf(x, fromLast=T)), rep(values/lengths, lengths)),
x)
[1] 1 1 1 1 1 1 1 1
它也适用于:
x = c(1, NA, 5, 3, 3, NA, NA, 1)
#[1] 1.0000000 2.5000000 2.5000000 3.0000000 3.0000000 0.3333333 0.3333333 0.3333333
我得到了一个 data.frame 每小时值。有时我会错过几个小时的值,并想用第一个非缺失值除以缺失值的计数+1(非缺失值也是其中的一部分:
即(非常简化的版本)
c(1,NA,NA,NA,4,NA,2,1)
我想要的是:
c(1,(4/4),(4/4),(4/4),(4/4),(2/2),(2/2),1)
这将是:
c(1,1,1,1,1,1,1,1,1)
目前我使用带有 na.locf 的动物园,它将所有 NA 替换为第一个非 na:对于我们的示例,这意味着:
c(1,4,4,4,4,2,2,1)
谢谢
您需要合并 na.locf
和 rle
:
library(zoo)
ifelse(is.na(x) | is.na(c(0, head(x,-1))),
with(rle(na.locf(x, fromLast=T)), rep(values/lengths, lengths)),
x)
[1] 1 1 1 1 1 1 1 1
它也适用于:
x = c(1, NA, 5, 3, 3, NA, NA, 1)
#[1] 1.0000000 2.5000000 2.5000000 3.0000000 3.0000000 0.3333333 0.3333333 0.3333333