R 如何用最接近的两个值的平均值替换NAs

R 如何用最接近的两个值的平均值替换NAs,r,replace,na,R,Replace,Na,我有以下数据: data <- structure(list(A = c(10L, 25L, NA, 17L, 8L, 3L), B = c(2L, NA, NA, NA, NA, 2L), C = c(NA, 4L, 6L, 4L, 3L, NA)), class = "data.frame", row.names = c(NA, -6L)) 我想用该列最近的两个可用值的平均值替换每列的NAs。结果如下所示: data <- structure(list(A = c(10L,

我有以下数据:

data <- structure(list(A = c(10L, 25L, NA, 17L, 8L, 3L), B = c(2L, NA, 
NA, NA, NA, 2L), C = c(NA, 4L, 6L, 4L, 3L, NA)), class = "data.frame", row.names = c(NA, 
-6L))
我想用该列最近的两个可用值的平均值替换每列的NAs。结果如下所示:

data <- structure(list(A = c(10L, 25L, 21L, 17L, 8L, 3L), B = c(2L, 2L, 
2L, 2L, 2L, 2L), C = c(4L, 4L, 6L, 4L, 3L, 3L)), class = "data.frame", row.names = c(NA, 
-6L))
我们可以使用na

数据
这是一个使用近似和选项规则=2的基本R解决方案


我在C栏得到的是-7而不是4,在同一栏得到的是8而不是3?@mustafa我只使用了你的数据集B C[1,]10.000002-7[2,]25.000002 4[3,]24.92828 2 6[4,]17.000002 4[5,]8.000002 3[6,]3.0000028@mustafa你现在能查一下吗。很抱歉,出现了混淆。您认为如果列格式更改为日期或时间,代码应该适用吗?谢谢!我尝试将代码应用于包含日期和时间列的较大数据,但它不起作用。
library(zoo)
data[] <- lapply(data,  function(x) na.locf0(na.approx(x, na.rm = FALSE)))
library(dplyr)
library(tidyr)
data %>%
  mutate_all(na.approx, na.rm = FALSE) %>%
  fill(everything(), .direction = 'updown')
#  A B C
#1 10 2 4
#2 25 2 4
#3 21 2 6
#4 17 2 4
#5  8 2 3
#6  3 2 3
data <- structure(list(A = c(10L, 25L, NA, 17L, 8L, 3L), 
   B = c(2L, NA, NA, NA, NA, 2L), 
   C = c(NA, 4L, 6L, 4L, 3L, NA)), class = "data.frame", row.names = c(NA, -6L))
data[] <- Map(function(x) approx(seq_along(x)[!is.na(x)],
                                 na.omit(x),
                                 seq_along(x),
                                 rule = 2)$y, 
              data)
> data
   A B C
1 10 2 4
2 25 2 4
3 21 2 6
4 17 2 4
5  8 2 3
6  3 2 3