在R中用前后行的平均值替换NA。

12

我该如何快速地用其前后行的均值来替换NA值?

  name grade
1    A    56
2    B    NA
3    C    70
4    D    96

这样B的成绩将是63分。


如果相邻的值也缺失了怎么办?或许尝试这种方法 - Robert Krzyzanowski
3个回答

18

你可以尝试使用来自包zoona.approx函数:"缺失值将被线性插值替换"

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

如果你有超过一个连续的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

na.approx 基于 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

11
假设您有一个像这样的数据框df
> df
  name grade
1    A    56
2    B    NA
3    C    70
4    D    96
5    E    NA
6    F    95

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

> 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

使用以下代码实现以下功能:如果x=condition,则用x-1和x+3的平均值替换x和接下来的2个值。这将更改代码为:ind <- which(df$grade<(-100))df$grade[ind:ind+2] <- sapply(ind, function(i) with(df, mean(c(grade[i-1], grade[i+3])))) 对于x<-100。 - Anne
作为sapply调用的替代方案,您也可以使用:df$grade[ind] <- with(df, ((grade[ind-1] + grade[ind+1])/2)) - Jaap

0

使用中位数而非平均数的替代方案,可以使用randomForest包中的na.roughfix函数。如文档所述,它适用于数据框或数字矩阵。具体来说,对于数字变量,NAs将被替换为列中位数。对于因子变量,NAs将被替换为最常见的水平(在随机情况下打破平局)。如果对象不包含NAs,则返回未更改的对象。

使用与@Henrik相同的示例:

library(randomForest)
x <- c(56, NA, 70, 96) 
na.roughfix(x)

#[1] 56 70 70 96

或者使用更大的矩阵:

y <- matrix(1:50, nrow = 10)
y[sample(1:length(y), 4, replace = FALSE)] <- NA
y
#      [,1] [,2] [,3] [,4] [,5]
# [1,]    1   11   21   31   41
# [2,]    2   12   22   32   42
# [3,]    3   NA   23   33   NA
# [4,]    4   14   24   34   44
# [5,]    5   15   25   35   45
# [6,]    6   16   NA   36   46
# [7,]    7   17   27   37   47
# [8,]    8   18   28   38   48
# [9,]    9   19   29   39   49
# [10,]   10  20   NA   40   50

na.roughfix(y)
#      [,1] [,2] [,3] [,4] [,5]
# [1,]    1   11 21.0   31   41
# [2,]    2   12 22.0   32   42
# [3,]    3   16 23.0   33   46
# [4,]    4   14 24.0   34   44
# [5,]    5   15 25.0   35   45
# [6,]    6   16 24.5   36   46
# [7,]    7   17 27.0   37   47
# [8,]    8   18 28.0   38   48
# [9,]    9   19 29.0   39   49
#[10,]   10   20 24.5   40   50

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接