将NA替换为R中的上一行和下一行

sia*_*sia 10 replace r na

如何以快速方式替换NA的前一行和下一行的平均值?

  name grade
1    A    56
2    B    NA
3    C    70
4    D    96
Run Code Online (Sandbox Code Playgroud)

这样B的成绩将是63.

Hen*_*rik 12

或者您可以尝试na.approx使用包zoo:"缺失值(NAs)被线性插值替换"

library(zoo)
x <- c(56, NA, 70, 96)
na.approx(x)
# [1] 56 63 70 96
Run Code Online (Sandbox Code Playgroud)

如果你有多个连续的话,这也有效NA:

vals <- c(1, NA, NA, 7, NA, 10)
na.approx(vals) 
# [1]  1.0  3.0  5.0  7.0  8.5 10.0
Run Code Online (Sandbox Code Playgroud)

na.approx基于base函数approx,可以使用它:

vals <- c(1, NA, NA, 7, NA, 10)
xout <- seq_along(vals)
x <- xout[!is.na(vals)]
y <- vals[!is.na(vals)]

approx(x = x, y = y, xout = xout)$y
# [1]  1.0  3.0  5.0  7.0  8.5 10.0
Run Code Online (Sandbox Code Playgroud)


Jil*_*ina 9

假设你有一个df像这样的data.frame :

> df
  name grade
1    A    56
2    B    NA
3    C    70
4    D    96
5    E    NA
6    F    95
Run Code Online (Sandbox Code Playgroud)

然后你可以使用以下内容:

> ind <- which(is.na(df$grade))
> df$grade[ind] <- sapply(ind, function(i) with(df, mean(c(grade[i-1], grade[i+1]))))
> df
  name grade
1    A    56
2    B    63
3    C    70
4    D    96
5    E  95.5
6    F    95
Run Code Online (Sandbox Code Playgroud)