如何解决R在tidyverse中创建多个日期范围
我正试图找出一种方法来分离数据中的各个间隔,以便与ID关联的每一行都具有最小持续时间和最大持续时间,并以不适用的月份进行细分。
我有看起来像这样的数据,但是有9列和275行
df <- data.frame("ID" = c(1:5),"jan" = c("2020-01-01",NA,"2020-01-01","2020-01-01"),"feb" = c("2020-02-01","2020-02-01","2020-02-01"),"mar" = c("2020-03-01","2020-03-01",NA),"apr" = c(NA,"2020-04-01","2020-04-01"),"may" = c("2020-05-01","2020-05-01","2020-05-01"),"jun" = c("2020-06-01","2020-06-01",NA)
)
理想情况下,列应为:
ID Start1 Stop1 Start2 Stop2
1 "2020-01-01" "2020-03-01" "2020-05-01" "2020-06-01"
....
编辑:我已经对此进行了编辑,因为A)尽管重复的问题仅与切线相关,但仍被标记为重复,B)因为我确实在寻找一个整洁的解决方案-这就是我所得到的>
解决方法
您可以获取长格式的数据,并在每个NA
值处创建一个新的开始和停止组。为每个组选择first
和last
日期值,并以宽格式获取数据。
library(dplyr)
df %>%
tidyr::pivot_longer(cols = -ID) %>%
group_by(ID,grp = cumsum(is.na(value))) %>%
na.omit() %>%
summarise(start = first(value),stop = last(value)) %>%
mutate(grp = row_number()) %>%
pivot_wider(names_from = grp,values_from = c(start,stop)) %>%
select(ID,order(readr::parse_number(names(.))))
# ID start_1 stop_1 start_2 stop_2
# <int> <chr> <chr> <chr> <chr>
#1 1 2020-01-01 2020-03-01 2020-05-01 2020-06-01
#2 2 2020-02-01 2020-06-01 NA NA
#3 3 2020-01-01 2020-01-01 2020-06-01 2020-06-01
#4 4 2020-01-01 2020-04-01 NA NA
#5 5 2020-01-01 2020-02-01 2020-04-01 2020-05-01
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。