【问题标题】:Fill in missing dates with NAs by group in R - with NA at end of date range as well在 R 中按组用 NA 填充缺失的日期 - NA 也在日期范围的末尾
【发布时间】:2021-03-15 14:48:19
【问题描述】:

我想为大型数据集中的缺失日期生成空行 (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 中为 02-16 添加一个 NA 单元格呢?

任何帮助将不胜感激。

【问题讨论】:

    标签: r date na


    【解决方案1】:

    我认为您的第二次尝试已接近尾声。如果您想在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-03-15 创建

    【讨论】:

    • 谢谢!我认为这会奏效!是的,对不起,我用 R 中的 as.Date() 转换了我的日期,但这里没有包含它。
    猜你喜欢
    • 2016-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 2011-04-02
    • 2015-10-19
    相关资源
    最近更新 更多