将NA替换为NA之前和之后的平均值

时间:2017-10-12 15:01:18

标签: r replace average na

说我有以下data.frame:

t<-c(1,1,2,4,5,4)
u<-c(1,3,4,5,4,2)
v<-c(2,3,4,5,NA,2)
w<-c(NA,3,4,5,2,3)
x<-c(2,3,4,5,6,NA)

df<-data.frame(t,u,v,w,x)

我想用代表NA之前和之后的平均值的值替换NA,除非行以NA开始(第4行)或结束(第5行)。当行以NA开头时,我想用以下情况替换NA。当行以NA结束时,我想用前一个案例替换NA。

因此,我希望我的输出看起来像:

t<-c(1,1,2,4,5,4)
u<-c(1,3,4,5,4,2)
v<-c(2,3,4,5,3.5,2)
w<-c(3,3,4,5,2,3)
x<-c(2,3,4,5,6,6)

df<-data.frame(t,u,v,w,x)

2 个答案:

答案 0 :(得分:3)

问题是第4行以NA开头,第5行以NA结尾,但实际上输入df的第4列以NA开头,第5列输入以NA结尾,第4行也没有输入的第5行以NA开头或结尾,所以我们假设该列是指,而不是行。此外,在问题中还有两个名为df的数据框。显然,一个应该代表输入,另一个具有相同名称的数据框是输出,但为了完全清楚,我们重复了我们在最后的注释中使用的df的定义。

动物园里的

na.approx几乎就是这样。 (如果矩阵结果正常,则省略data.frame()部分。)

library(zoo)

data.frame(na.approx(df, rule = 2))

,并提供:

  t u   v w x
1 1 1 2.0 3 2
2 1 3 3.0 3 3
3 2 4 4.0 4 4
4 4 5 5.0 5 5
5 5 4 3.5 2 6
6 4 2 2.0 3 6

注意:为清楚起见,我们将此数据框用作上面的输入:

df <- structure(list(t = c(1, 1, 2, 4, 5, 4), u = c(1, 3, 4, 5, 4, 
2), v = c(2, 3, 4, 5, NA, 2), w = c(NA, 3, 4, 5, 2, 3), x = c(2, 
3, 4, 5, 6, NA)), .Names = c("t", "u", "v", "w", "x"), row.names = c(NA, 
-6L), class = "data.frame")

答案 1 :(得分:1)

sapply(df, function(x){
    replace(x, is.na(x), rowMeans(cbind(c(NA, head(x, -1)), c(x[-1], NA)), na.rm = TRUE)[is.na(x)])
})
#     t u   v w x
#[1,] 1 1 2.0 3 2
#[2,] 1 3 3.0 3 3
#[3,] 2 4 4.0 4 4
#[4,] 4 5 5.0 5 5
#[5,] 5 4 3.5 2 6
#[6,] 4 2 2.0 3 6