如何通过扩展最后可用的行来填充缺失的行?
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
我有一个数据库,其中每一行都有一个日历月(“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