【问题标题】:Fill empty cells between two values in column with last non empty cell and next non empty cell in R用R中的最后一个非空单元格和下一个非空单元格填充列中两个值之间的空单元格
【发布时间】:2021-12-03 01:52:17
【问题描述】:

我需要循环遍历数据框中的 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 属于下一个。

我知道我需要使用zoo 包中的na.locf,它适用于大型数据库,用于根据最后一个非空单元格填充空值,以及fromLast 参数来执行“下一步”观察倒退”。但是,我不能构造一个循环来解释偶数或奇数个 NA 值,并将这两个值一起使用。

使用 tidyverse 包,

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

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

【问题讨论】:

  • 如果两个非NA之间有1个NA,你是否从前一个元素中取出非NA
  • 不,对于下一个(将 n 和 n+1 用于 NA 值的前半部分和后半部分,因此 n=0)

标签: r dplyr tidyr zoo locf


【解决方案1】:

定义 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)

【讨论】:

  • 我面临的一个错误是当 A == B 时,缺少的 NA 值将不会被填充,因为它们是相同的级别。
  • 答案确实表明它假设没有重复。这是基于问题中的例子,在这个例子中这是正确的。无论如何,我已经对其进行了修改以允许它们。
【解决方案2】:

我想最简单的方法是使用函数:na.locf: Last Observation Carried Forward if we are in zoo/time-series.

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    • 2019-10-01
    • 1970-01-01
    • 2019-11-21
    相关资源
    最近更新 更多