如何通过扩展最后可用的行来填充缺失的行?

How to fill in missing rows by extending last available row?

我有一个数据库,其中每一行都有一个日历月(“Period_1”)和自元素开始以来经过的月数(“Period_2”)指定。

出于分析目的,使用 Period_1 和 Period_2 分组解析数据(使用 Shiny,为简单起见已从以下示例中删除)。

问题是当按自元素开始以来经过的月数分组时 (Period_2),当基础元素起源于接近 Period_1 终结期(本例中为 2020-04 年)时,行数较少例子)。例如,在下面的数据框“数据”中,您可以看到两个元素是如何在 2020-04 之前产生的,但是第一个元素的产生时间比第二个元素晚两个月(按日历计算),因此只有两个月过去了(或两个“Period_2”)表示第一个元素,而第二个元素经过四个句点。

数据框和生成它的代码:

> data
  ID Period_1 Period_2 ColA ColB
1  1  2020-03        1   10   15
2  1  2020-04        2   20   25
3  2  2020-01        1   30   35
4  2  2020-02        2   40   45
5  2  2020-03        3   50   55
6  2  2020-04        4   52   87
    
data <- data.frame(
    ID = c(1,1,2,2,2,2),
    Period_1 = c("2020-03", "2020-04", "2020-01", "2020-02", "2020-03", "2020-04"),
    Period_2 = c(1, 2, 1, 2, 3, 4),
    ColA = c(10, 20, 30, 40, 50, 52),
    ColB = c(15, 25, 35, 45, 55, 87)
    )

现在按 Period_2 对数据进行分组,生成数据的代码如下所示:

> groupData
# A tibble: 4 x 3
  Period_2  ColA  ColB   [Notes...]
     <dbl> <dbl> <dbl>
1        1    40    50   [Elements 1 and 2 included]
2        2    60    70   [Elements 1 and 2 included]
3        3    50    55   [Element 2 only]
4        4    52    87   [Element 2 only]
    
groupData <- 
  data %>%
    group_by(Period_2) %>%
      select("ColA","ColB") %>%
      summarise(across(everything(), sum))

我想做的是,当给定 ID 的最大值 Period_2(此数据框示例中元素 1 = 两个的最大值 Period_2)小于整个 ID 的最大值时数据框(此数据框示例中的最大值为四),然后将其他(缺失的)行放置在该行下方,复制该 ID 的最后可用 ColA 和 ColB 数量。 (在我的实际数据集中,在最后一个月之前衰减太多,剩余数量不是很多 material 所以向下复制是可以的 - 但他们确实会随着行数减少而放弃比率计算)。所以在这个例子中,数据框将扩展如下:

> data
  ID Period_1 Period_2 ColA ColB   [Notes...]
1  1  2020-03        1   10   15   [Original data OK]
2  1  2020-04        2   20   25   [Original data OK]
3  1  NA             3   20   25   [Copy values down from last available Period_2 (=2) to fill in missing periods 3 and 4] 
4  1  NA             4   20   25   [Copy values down from last available Period_2 (=2) to fill in missing periods 3 and 4]
5  2  2020-01        1   30   35   [Original data OK]
6  2  2020-02        2   40   45   [Original data OK]
7  2  2020-03        3   50   55   [Original data OK]
8  2  2020-04        4   52   87   [Original data OK]

仅当使用 Period_2 解析数据时才需要发生此数据帧扩展。使用 Period_1 解析数据时一切正常:无需扩展。

有什么办法吗?某种 apply() 功能可能有用吗? dplyr() 有解决办法吗?

我会给你一个简单纯粹的tidyverse解决方案。首先,您必须通过变量组合扩展网格,您可以使用 expand()complete() 使隐式缺失值显式缺失。然后你想做 LOCF(最后的观察结转),这可以通过 complete() 中的 fill 参数或使用 fill() 函数来实现。所有功能都在 tidyr 包中。

library(tidyverse)

data <- data.frame(
  ID = c(1,1,2,2,2,2),
  Period_1 = c("2020-03", "2020-04", "2020-01", "2020-02", "2020-03", "2020-04"),
  Period_2 = c(1, 2, 1, 2, 3, 4),
  ColA = c(10, 20, 30, 40, 50, 52),
  ColB = c(15, 25, 35, 45, 55, 87)
)

data %>%
  tidyr::complete(ID, nesting(Period_2)) %>%
  tidyr::fill(ColA, ColB, .direction = "down")
#> # A tibble: 8 x 5
#>      ID Period_2 Period_1  ColA  ColB
#>   <dbl>    <dbl> <chr>    <dbl> <dbl>
#> 1     1        1 2020-03     10    15
#> 2     1        2 2020-04     20    25
#> 3     1        3 <NA>        20    25
#> 4     1        4 <NA>        20    25
#> 5     2        1 2020-01     30    35
#> 6     2        2 2020-02     40    45
#> 7     2        3 2020-03     50    55
#> 8     2        4 2020-04     52    87

reprex package (v2.0.1)

创建于 2022-01-21