如何用以前和以下措施的平均值替换缺失

时间:2014-10-16 18:41:37

标签: r multiple-columns mean

我有一个包含5列的数据集,其中每列都是度量。我试图用之前和之后的价值取代那些NA,但直到现在都没有运气。我搜索了一下,我找到了一个解决方案,如何用行的平均值替换NA,这里不能应用。任何帮助将不胜感激。我希望这个主题也会帮助其他人。

  A  B  C  D  E
 NA  7 NA  6  2
  4 NA  2  6 NA
  2  1 NA NA  5

期望的输出

A B C D E
6.5 7 6.5 6 2
4 3 2 6 4
2 1 2 2 5

在第一行6.5来自7和6的平均值,在第二行中3来自4和2的平均值,4来自平均值2和6.在第三行中2来自均值1和5。

谢谢。

2 个答案:

答案 0 :(得分:1)

以下所有内容都需要此设置:

library(zoo)
m <- matrix(c(NA, 4L, 2L, 7L, NA, 1L, NA, 2L, NA, 6L, 6L, NA, 2L, NA, 5L), 3) # input

1)我认为最好扩展两端的值,以便进行此更改,请尝试以下操作:

tm <- t(m)
mid <- (na.locf(tm) + na.locf(tm, fromLast = TRUE))/2
t(na.fill(mid, c("extend", NA)))

,并提供:

     [,1] [,2] [,3] [,4] [,5]
[1,]    7    7  6.5    6    2
[2,]    4    3  2.0    6    6
[3,]    2    1  3.0    3    5

顺便说一下,请注意1和5的平均值是3,而不是2。

2)这不是等同的,但它可能是你真正想要的并且很短。尝试扩展最终值的线性插值:

t(na.approx(t(m), rule = 2))

,并提供:

    [,1] [,2]     [,3]     [,4] [,5]
[1,]    7    7 6.500000 6.000000    2
[2,]    4    3 2.000000 6.000000    6
[3,]    2    1 2.333333 3.666667    5

3)另一种可能性,同样不等同于将每个NA替换为该行上非NA的均值:

t(na.aggregate(t(m)))

,并提供:

     [,1] [,2]     [,3]     [,4] [,5]
[1,]    5    7 5.000000 6.000000    2
[2,]    4    4 2.000000 6.000000    4
[3,]    2    1 2.666667 2.666667    5

4)这是(1)和(3)的混合。这填补了内部NAs与非NA的平均值 并且在该行中填写NAs与该行中的非NA的平均值:

tm <- t(m)
mid <- (na.locf(tm) + na.locf(tm, fromLast = TRUE))/2
ag <- na.aggregate(tm)
t(ifelse(is.na(mid), ag, mid))

,并提供:

    [,1] [,2] [,3] [,4] [,5]
[1,]    5    7  6.5    6    2
[2,]    4    3  2.0    6    4
[3,]    2    1  3.0    3    5

更新添加了更多方法和一些更正。

答案 1 :(得分:0)

我认为回答我问题的最好/最简单的方法是计算行的平均值并替换丢失的行。

我在那里找到答案Find and replace missing values with row mean

ind <- which(is.na(df), arr.ind=TRUE)
df[ind] <- rowMeans(df[2:6],  na.rm = TRUE)[ind[,1]]
df