我有一个包含国家、日期、标识符、cumulative_identifier、cumulative_country 的数据框。国家、数据和标识符被分组。但是,我有缺少日期的国家/地区和标识符。这些国家/地区这些天尚未提交此标识符的数据。我想包括这些日期,但使用最近提交的数据。
数据必须按国家、日期和标识符分组。例如下面给出一个数据框。
country date identifier cumulative_id cumulative_country
France 2021-03-20 B.1.1.7 3528 12158
France 2021-03-15 B.1.1.7 3520 12150
France 2021-03-15 B.1.2 50 12142
France 2021-03-14 B.1.2 48 12140
Morocco 2021-03-16 B.1.1.7 232 5636
Morocco 2020-03-01 B.1.1.7 220 5624
在上面的示例中,缺少许多日期。添加的日期将使用最近提交的信息。所以法国和摩洛哥应该是这样的:
country date identifier cumulative_id cumulative_country
France 2021-03-20 B.1.1.7 3528 12158
France 2021-03-19 B.1.1.7 3520 12150
France 2021-03-18 B.1.1.7 3520 12150
France 2021-03-17 B.1.1.7 3520 12150
France 2021-03-16 B.1.1.7 3520 12150
France 2021-03-20 B.1.2 50 12142
France 2021-03-19 B.1.2 50 12142
France 2021-03-18 B.1.2 50 12142
France 2021-03-17 B.1.2 50 12142
France 2021-03-16 B.1.2 50 12142
France 2021-03-15 B.1.2 50 12142
France 2021-03-14 B.1.2 48 12140
France 2021-03-13 B.1.2 48 12140
Morocco 2021-03-20 B.1.1.7 232 5636
Morocco 2021-03-19 B.1.1.7 232 5636
Morocco 2021-03-18 B.1.1.7 232 5636
Morocco 2021-03-17 B.1.1.7 232 5636
Morocco 2021-03-16 B.1.1.7 232 5636
Morocco 2021-03-15 B.1.1.7 220 5624
...
Morocco 2021-03-01 B.1.1.7 220 5624
这是我尝试使用 Aurèle 的建议: 但是,生成的日期框架与原始日期框架相同,没有任何更改。同样,完成需要 8 分钟,因为数据集中已有超过 100,000 个观测值。
horizontal$date <- as.Date(horizontal$date)
df <- df %>%
complete(nesting(country, pango_lineage), date = full_seq(date, 1)) %>%
group_by(country, pango_lineage) %>%
mutate(across(c(cum_country_pang, cum_country), zoo::na.locf, na.rm = FALSE)) %>%
filter(!is.na(cum_country_pang))
答案 0 :(得分:2)
使用 tidyr
complete
和 zoo
na.locf
(最后一次观察结转):
library(tidyr)
library(dplyr)
df %>%
complete(nesting(country, identifier), date = full_seq(date, 1)) %>%
group_by(country, identifier) %>%
mutate(across(c(cumulative_id, cumulative_country), zoo::na.locf, na.rm = FALSE)) %>%
filter(!is.na(cumulative_id))
#> # A tibble: 398 x 5
#> # Groups: country, identifier [3]
#> country identifier date cumulative_id cumulative_country
#> <chr> <chr> <date> <int> <int>
#> 1 France B.1.1.7 2021-03-15 3520 12150
#> 2 France B.1.1.7 2021-03-16 3520 12150
#> 3 France B.1.1.7 2021-03-17 3520 12150
#> 4 France B.1.1.7 2021-03-18 3520 12150
#> 5 France B.1.1.7 2021-03-19 3520 12150
#> 6 France B.1.1.7 2021-03-20 3528 12158
#> 7 France B.1.2 2021-03-14 48 12140
#> 8 France B.1.2 2021-03-15 50 12142
#> 9 France B.1.2 2021-03-16 50 12142
#> 10 France B.1.2 2021-03-17 50 12142
#> # ... with 388 more rows
数据:
df <- read.table(text =
'country date identifier cumulative_id cumulative_country
France 2021-03-20 B.1.1.7 3528 12158
France 2021-03-15 B.1.1.7 3520 12150
France 2021-03-15 B.1.2 50 12142
France 2021-03-14 B.1.2 48 12140
Morocco 2021-03-16 B.1.1.7 232 5636
Morocco 2020-03-01 B.1.1.7 220 5624
', header = TRUE)
df$date <- as.Date(df$date)
答案 1 :(得分:0)
不要使用 zoo::na.locf
,只需使用 tidyr::fill
library(dplyr)
library(tidyr)
df %>%
complete(nesting(country, identifier), date = full_seq(date, 1)) %>%
group_by(country, identifier) %>%
fill(c(cumulative_id, cumulative_country), .direction = "down") %>%
filter(!is.na(cumulative_id))
#> # A tibble: 398 x 5
#> # Groups: country, identifier [3]
#> country identifier date cumulative_id cumulative_country
#> <chr> <chr> <date> <int> <int>
#> 1 France B.1.1.7 2021-03-15 3520 12150
#> 2 France B.1.1.7 2021-03-16 3520 12150
#> 3 France B.1.1.7 2021-03-17 3520 12150
#> 4 France B.1.1.7 2021-03-18 3520 12150
#> 5 France B.1.1.7 2021-03-19 3520 12150
#> 6 France B.1.1.7 2021-03-20 3528 12158
#> 7 France B.1.2 2021-03-14 48 12140
#> 8 France B.1.2 2021-03-15 50 12142
#> 9 France B.1.2 2021-03-16 50 12142
#> 10 France B.1.2 2021-03-17 50 12142
#> # … with 388 more rows
由 reprex package (v1.0.0) 于 2021 年 4 月 2 日创建