gpt4 book ai didi

r - 按组在 R 中创建日期序列,取决于另一个变量

转载 作者:行者123 更新时间:2023-12-04 10:39:18 26 4
gpt4 key购买 nike

现在,我的数据集是宽格式的,这意味着我每个人只有一行,但我想要一个长数据集,每个人有多行。我有两个日期变量 ADATE 和 DDATE,我想分别将它们用作起点和终点。例如,如果某人的 ADATE 是 02/04/10,而 DDATE 是 02/07/10,我想要 4 行:

有:

ID ADATE     DDATE     
1 02/04/10 02/07/10

想:
ID ADATE     DDATE     NEW_DATE
1 02/04/10 02/07/10 02/04/10
1 02/04/10 02/07/10 02/05/10
1 02/04/10 02/07/10 02/06/10
1 02/04/10 02/07/10 02/07/10

我有多个数据集要执行此操作,并且我编写了适用于除一个数据集之外的每个数据集的代码......我不知道为什么。这是我的尝试和我得到的错误:
jan15_long <- chf_jan15 %>%
mutate(NEW_DATE = as.Date(ADATE)) %>%
group_by(ID) %>%
complete(NEW_DATE = seq.Date(as.Date(ADATE), as.Date(DDATE), by = "day")) %>%
fill(vars) %>%
ungroup()
Error in seq.Date(as.Date(ADATE), as.Date(DDATE), by = "day") :
'from' must be of length 1

上面的代码给了我想要的东西,并且可以完美地运行我拥有的所有其他数据集(11 个中的 10 个)。

有一个更好的方法吗? dplyr对我来说最有意义,所以希望有一个解决方案。

最佳答案

如果有多于一行,则 seq需要循环。我们可以使用 map2 .此外,基于 format 'DATE' 列中的 as.Date需要一个 format参数,即 as.Date(ADATE, "%m/%d/%y") (假设是月/日/年格式)

library(dplyr)
library(purrr)
library(lubridate)
chf_jan15 %>%
mutate_at(vars(ends_with("DATE")), mdy) %>%
mutate(random_date = map2(ADATE, DDATE, seq, by = "day")) %>%
unnest(c(random_date))
# A tibble: 4 x 4
# ID ADATE DDATE random_date
# <int> <date> <date> <date>
#1 1 2010-02-04 2010-02-07 2010-02-04
#2 1 2010-02-04 2010-02-07 2010-02-05
#3 1 2010-02-04 2010-02-07 2010-02-06
#4 1 2010-02-04 2010-02-07 2010-02-07

如果只有一行,转换为 Date后类, complete应该管用
library(tidyr)
chf_jan15 %>%
mutate_at(vars(ends_with("DATE")), as.Date, format = "%m/%d/%y") %>%
mutate(NEW_DATE = ADATE) %>%
complete(NEW_DATE = seq(ADATE, DDATE, by = 'day')) %>%
fill(c(ID, ADATE, DDATE))
# A tibble: 4 x 4
# NEW_DATE ID ADATE DDATE
# <date> <int> <date> <date>
#1 2010-02-04 1 2010-02-04 2010-02-07
#2 2010-02-05 1 2010-02-04 2010-02-07
#3 2010-02-06 1 2010-02-04 2010-02-07
#4 2010-02-07 1 2010-02-04 2010-02-07

如果每个“ID”都有一行,那么我们可以 group_split并使用 complete
chf_jan15 %>%
mutate_at(vars(ends_with("DATE")), as.Date, format = "%m/%d/%y") %>%
mutate(NEW_DATE = ADATE) %>%
group_split(ID) %>%
map_dfr(~ .x %>%
complete(NEW_DATE = seq(ADATE, DDATE, by = 'day')) %>%
fill(c(ID, ADATE, DDATE)))

数据
chf_jan15 <- structure(list(ID = 1L, ADATE = "02/04/10", 
DDATE = "02/07/10"), class = "data.frame", row.names = c(NA,
-1L))

关于r - 按组在 R 中创建日期序列,取决于另一个变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60009752/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com