在R中填写6个月日期的()

lpwwtiir  于 2023-02-10  发布在  其他
关注(0)|答案(2)|浏览(129)

我有6个月间隔的数据(ID、6个月开始日期、结局值),但对于某些ID,有半年的结局缺失。

id = c("aa", "aa", "ab", "ab", "ab")
date = as.Date(c("2021-07-01", "2022-07-01", "2021-07-01", "2022-01-01", "2022-07-01"))
col3 = c(1,2,1,2,1)

df <- data.frame(id, date, col3)

对于日期为每月的类似数据集,我使用complete(date = seq.Date(start date, end date, by = "month")来填充缺失的月份,并在第3列的outcome字段中添加0。
我可以执行以下操作并将数据扩展为monthly,然后创建一个新的6个月的start date列,按它和ID分组,并对col3求和。

df_complete <- df %>% group_by(id) %>%
  complete(date = seq.Date(as.Date(min(date)), as.Date(max(date) %m+% months(5)), by="month")) %>% 
  mutate (col3 = replace_na(col3, 0))

df_complete_6mth <- df_complete %>% mutate(
  halfyear =  ifelse(as.integer(format(date, '%m')) <= 6, 
                                 paste0(format(date, '%Y'), '-01-01'),
                                 paste0(format(date, '%Y'), '-07-01'))) %>%
  group_by(id, halfyear) %>%
  summarise(col3_halfyear = sum(col3))

但是,是否有一个解决方案,其中“by =”参数指定6个月?

df_complete <- df %>% group_by(id) %>%
  complete(date = seq.Date(as.Date(min(date)), as.Date(max(date) %m+% months(5)), by="months(6)")) %>% 
  mutate (col3 = replace_na(col3, 0))

但没有成功。

lmyy7pcs

lmyy7pcs1#

seq.Date的帮助中:

by可以通过多种方式指定。

一个数字,以天为单位。
类difftime的对象
一个字符串,包含“日”、“周”、“月”、“季度”或“年”之一。它可以选择在前面加一个(正或负)整数和一个空格,或在后面加“s”。
所以我希望你想:

library(dplyr); library(tidyr)
df %>%  
 group_by(id) %>% 
 complete(date = seq.Date(min(date), max(date), by="6 month"), 
          fill = list(col3 = 0))
irlmq6kh

irlmq6kh2#

你能这样做吗?你按月份做一个日期序列,然后在第一个之后每隔六个取一个。

library(lubridate)
dates <- seq(mdy("01-01-2020"), mdy("01-01-2023"), by="month")
dates[seq(1, length(dates), by=6)]
#> [1] "2020-01-01" "2020-07-01" "2021-01-01" "2021-07-01" "2022-01-01"
#> [6] "2022-07-01" "2023-01-01"

reprex package(v2.0.1)于2023年2月8日创建

相关问题