r - 在 R 中按组创建日期序列,取决于另一个变量
问题描述
现在,我的数据集是宽格式的,这意味着我每人只有一行,但我想要一个长数据集,每人多行。我有两个日期变量 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
“日期”列,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))
推荐阅读
- java - Android Room 属性在保存到数据库之前验证?
- python-3.x - 从 word hippo 抓取网页
- oauth-2.0 - 用于保护 REST API 的 OAuth2 流程
- javascript - 我们可以在 React 的 Const 中设置样式吗
- python - 有没有办法在 tkinter 窗口内打印函数?
- git - 为什么 Git 知道它可以挑选一个还原的提交?
- vim - 使用 ctags 为文件创建标签
- javascript - javascript逻辑错误中的PHP fopen()
- node.js - 如何修复授权错误 403?我在“developer.google.com/oauthplayground”上授权我的 api 时得到的
- node.js - 嵌套for循环中的node.js等待失败