如何以快速方式替换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)
假设你有一个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)
归档时间: |
|
查看次数: |
3050 次 |
最近记录: |