用R中数据框中的最新数据填充缺失的日期

时间:2021-04-02 14:10:00

标签: r date tidyverse lubridate data-transform

我有一个包含国家、日期、标识符、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))

enter image description here

2 个答案:

答案 0 :(得分:2)

使用 tidyr completezoo 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 日创建