3

我需要遍历数据框中的 ID,通过在 NA 单元格之外的最后一个填充条目和第一个填充条目之间均匀地分配空单元格来填充列中的 NA 值。

ID     Value    X     Y
1          A      x     y 
1         NA      x     y 
1         NA      x     y 
1         NA      x     y 
1         NA      x     y 
1         NA      x     y 
1          B      x     y
2          C      x     y
2         NA      x     y
2         NA      x     y
2         NA      x     y
2         NA      x     y
2          D      x     y

应该填写到这个:

ID     Value    X     Y
1          A      x     y 
1          A      x     y 
1          A      x     y 
1          B      x     y 
1          B      x     y 
1          B      x     y 
1          B      x     y
2          C      x     y
2          C      x     y
2          C      x     y
2          D      x     y
2          D      x     y
2          D      x     y

在观察之间有2n 个NA 值的情况下, n归因于最后一个,n归因于下一个。在2n+1 个值的情况下,n属于最后一个,n+1属于下一个。

我知道我需要使用与大型数据库配合使用na.locfzoo包,用于根据最后一个非空单元格填充空值,以及fromLast执行“下一个向后观察”的参数。但是,我无法构建一个循环来解释偶数或奇数个 NA 值,并将这两个值一起使用。

使用 tidyverse 包,

> library(tidyr)
> library(dplyr)
> df %>% dplyr::group_by(test$id) %>% fill(Value, .direction ="downup") %>% dplyr::ungroup()

这会在两个方向上填充 NA 值,但不考虑组中 NA 单元格的不同边界值。

4

2 回答 2

4

定义 interp 用连续整数替换每个连续的非 NA,应用 na.appro9x,四舍五入并用原始值替换结果整数。

library(zoo)

interp <- function(x) {
   x0 <- ifelse(is.na(x), NA, cumsum(!is.na(x)))
   xx <- na.approx(x0, rule = 2)
   na.omit(x)[round(xx)]
}
transform(DF, Value = interp(Value))

给予:

   ID Value X Y
1   1     A x y
2   1     A x y
3   1     A x y
4   1     B x y
5   1     B x y
6   1     B x y
7   1     B x y
8   2     C x y
9   2     C x y
10  2     C x y
11  2     D x y
12  2     D x y
13  2     D x y

笔记

假设输入如下,以可重现的形式显示。

Lines <- "ID     Value    X     Y
1          A      x     y 
1         NA      x     y 
1         NA      x     y 
1         NA      x     y 
1         NA      x     y 
1         NA      x     y 
1          B      x     y
2          C      x     y
2         NA      x     y
2         NA      x     y
2         NA      x     y
2         NA      x     y
2          D      x     y"
DF <- read.table(text = Lines, header = TRUE)
于 2021-10-14T18:02:54.620 回答
1

我想最简单的方法是使用函数:na.locf:如果我们在动物园/时间序列中,则最后一次观察结转。

见:https ://www.rdocumentation.org/packages/zoo/versions/1.8-9/topics/na.locf

于 2021-10-15T08:46:22.800 回答