我有一个包含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。
谢谢。
答案 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