在 R 中按组用 NA 填写缺失日期 - 在日期范围结束时也用 NA

Fill in missing dates with NAs by group in R - with NA at end of date range as well

我想为大型数据集中缺失的日期生成空行 (NA)。对于上下文,这是一个大型数据集,其中每个人 (ID) 都有不同年份的数据。

这里是两个人的数据的简化版本:

table <- "ID    Date    dist.km
 1 1     2007-10-15     15147
 2 1     2007-10-16     15156
 3 1     2007-10-17     15173
 4 1     2007-10-18     15185
 5 1     2007-10-19     15194
 6 1     2007-10-25     15202
 7 1     2007-10-26     15216
 8 1     2007-10-27     15240
 9 1     2007-10-28     15270
10 1     2007-10-29     15290
11 2     2008-10-15     15147
12 2     2008-10-16     15156
13 2     2008-10-17     15173
14 2     2008-10-18     15185
15 2     2008-10-19     15194
16 2     2008-10-20     15202
17 2     2008-10-21     15216
18 2     2008-10-29     15240
19 2     2008-10-30     15270
20 2     2008-10-31     15290"

#Create a dataframe with the above table
df <- read.table(text=table, header = TRUE)
df

我第一次尝试使用 complete(),这里:

library(tidyverse)

newdat <- complete(df, ID, Date)
newdat

此输出是原始数据集,数据集日期范围之外的所有日期均具有 NA 值。所以,有些日期没有填写。例如,2007-10-20 到 2007-10-24 没有填写 ID 1。所以基本上它是为我的距离数据日期范围之外的日期填写 NA 值,但不在其中。

然后我尝试了这种格式:

library(dplyr)
library(tidyr)

newdat2 <- dat %>% group_by(ID) %>%
  complete(Date = seq.Date(min(Date), max(Date), by = "day"))
newdat2

这行得通,但这不会产生超出每个 ID 日期范围的日期。所以每种格式都会产生相反的结果。我希望在每个 ID 的日期范围末尾至少获得一个 NA 以显示该集合的末尾。如果无法使用 complete() 完成此操作,也许我的问题是:如何在我的数据集的每一年中为特定日期添加空白 NA 单元格?所有数据集都从 10-15 开始,到 02-15 结束。那么,如何在每一年为每个 ID 添加一个 NA 单元格 02-16?

如有任何帮助,我们将不胜感激。

我认为您的第二次尝试已接近尾声。如果你想在 complete 调用中手动强制执行扩展限制,你可以在那里进行。目前尚不清楚您所追求的限制是什么,但也许以下内容可以帮助您实现目标。请注意,我使用了两个日期范围,因为您似乎想要达到两个时间范围。但如果我误解了,请调整。如果您将这些日期存储在某处,也可以以编程方式调用。此外,我在导入期间使用 as.Date() 将您的 date 列转换为实际日期格式。

library(tidyverse)

table <- "ID    Date    dist.km\n 1 1     2007-10-15     15147\n 2 1     2007-10-16     15156\n 3 1     2007-10-17     15173\n 4 1     2007-10-18     15185\n 5 1     2007-10-19     15194\n 6 1     2007-10-25     15202\n 7 1     2007-10-26     15216\n 8 1     2007-10-27     15240\n 9 1     2007-10-28     15270\n10 1     2007-10-29     15290\n11 2     2008-10-15     15147\n12 2     2008-10-16     15156\n13 2     2008-10-17     15173\n14 2     2008-10-18     15185\n15 2     2008-10-19     15194\n16 2     2008-10-20     15202\n17 2     2008-10-21     15216\n18 2     2008-10-29     15240\n19 2     2008-10-30     15270\n20 2     2008-10-31     15290"

#Create a dataframe with the above table
df <- read.table(text=table, header = TRUE) %>% 
  mutate(Date = as.Date(Date))

# expand by feeding the limits of the date ranges to cover
newdat2 <- df %>%
  group_by(ID) %>%
  complete(Date = c(
    seq.Date(
      from = as.Date("2007-10-15"),
      to = as.Date("2008-02-15"),
      by = "day"
    ),
    seq.Date(
      from = as.Date("2008-10-15"),
      to = as.Date("2009-02-15"),
      by = "day"
    )
  ))

newdat2

#> # A tibble: 496 x 3
#> # Groups:   ID [2]
#>       ID Date       dist.km
#>    <int> <date>       <int>
#>  1     1 2007-10-15   15147
#>  2     1 2007-10-16   15156
#>  3     1 2007-10-17   15173
#>  4     1 2007-10-18   15185
#>  5     1 2007-10-19   15194
#>  6     1 2007-10-20      NA
#>  7     1 2007-10-21      NA
#>  8     1 2007-10-22      NA
#>  9     1 2007-10-23      NA
#> 10     1 2007-10-24      NA
#> # ... with 486 more rows

reprex package (v1.0.0)

于 2021 年 3 月 15 日创建