在 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 日创建
我想为大型数据集中缺失的日期生成空行 (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 日创建