【问题标题】:convert integer to date?将整数转换为日期?
【发布时间】:2021-08-17 15:00:55
【问题描述】:

我需要将整数变量转换为 Date 以运行图表测量基线前到干预后测量。该变量在此处列出:

project_month : int [1:29] -23 -22 -21 -20 -19 -18 -17 -16 -15 -14 ...

我尝试了几种方法,但似乎都没有奏效。以下是我尝试过的各种方法:

qic_u_chart <- QIH_data$data %>%
  mutate(x= as.Date(project_month))

警告信息: “未知或未初始化的列:data。”
UseMethod(“mutate_”)中的错误:没有适用于“mutate_”的方法应用于“NULL”类的对象

QIH_data <- QIH_data %>%
    mutate(project_month = 
    if_else(project_month <= as.Date("-1"), "baseline", "intervention"))

str(QIH_data)

charToDate(x) 中的错误:字符串不是标准的明确格式

【问题讨论】:

  • as.Date 需要格式为“2021-05-29”的日期,即实际日期。我想你的月份数字对应于实际日期......如果是这样,那么第一步是将 project_months 转换为它们对应的日期。这是你要找的吗?
  • 什么是QIH_data?现在,您将它用作一个列表,其中包含一个名为 data 的数据框/tibble,但我们不知道这是否是有意的。
  • 请使用dput 以可重现的形式显示您的输入,并显示预期的输出。请参阅r 标签页面顶部有关提问的信息。
  • 日期必须包含年、月和日。因此,如果要将月份转换为日期,则需要定义基准年和默认日期,例如第一个日期,然后从那里开始。没有通用月份这样的东西。一旦你有了它,你可以将日期构造为字符串并使用lubridate::ymd()
  • 如果您创建一个小的可重现示例以及预期的输出,这将更容易提供帮助。阅读how to give a reproducible example

标签: r


【解决方案1】:

如果您有一个表示月份的整数,无论​​是正数还是负数,并且可能有间隔,如果您选择开始日期,您可以执行以下操作:

init_date <- "2018-01-01"
v <- purrr::map_dbl(project_month, ~ {
  lubridate::ymd(init_date) + months(.x)
}) %>% lubridate::as_date()
> v
[1] "2017-10-01" "2017-11-01" "2018-01-01" "2018-02-01" "2018-04-01"

如果变量project_month是数据框的一部分,你可以使用dplyr::mutate

tibble(
  project_month = c(-3,-2,0,1,3)
) %>% 
mutate(
  date = lubridate::ymd(init_date) + months(project_month)
)

但是有一个问题。一个月不是时间间隔,因为并非所有月份都有相同的天数、小时数等。因此,这个简单的解决方案只有在初始日期设置为所有月份都存在的一天时才有效,即从 1 到 28 .

> lubridate::ymd("2018-01-29") + months(1)
[1] NA
> lubridate::ymd("2018-01-28") + months(1)
[1] "2018-02-28"

请注意,这非常类似于:

Split 52 weeks of data into 12 months

【讨论】:

  • 谢谢@xaviescacs。我的项目肯定在 data.frame 中,但我收到此错误:init_date % as_date() v purrr::map_dbl(month_id, ~{: object 'month_id' not found) 中的错误
  • 这有效:init_date % mutate( date = lubridate:: ymd(init_date) + months(project_month) )但是有没有办法将它设置为正确的年份?我有另一个名为“month_id”的变量,其中列出了 1-29 个月,我想知道是否可以将其转换为我的起始年份 2018-12-31 到今天?
  • 我假设您的意思是初始日期为“2018-12-31”的输出返回一些 NA 值。原因是不是每个月都有第 31 天。这就是为什么这种方法需要选择一个介于 1 到 28 之间的日期。您需要将日期设为每个月的最后一天吗?
猜你喜欢
  • 2018-10-16
  • 2022-07-07
  • 1970-01-01
  • 2011-05-05
  • 2011-05-28
  • 2014-07-19
  • 2014-12-19
相关资源
最近更新 更多