【问题标题】:Generate date from another date based column using ifelse and Mutate in R在 R 中使用 ifelse 和 Mutate 从另一个基于日期的列生成日期
【发布时间】:2019-08-17 07:43:25
【问题描述】:

我有 2 个输入列,例如 Visit_start_date、Visit_type 和一个输出列 - Visit_end_date

我需要根据以下条件填写 Visit_end_date 列的值

如果 visit_type 列具有“门诊”或“紧急情况”等值,则 visit_end_date 与 visit_start_date 相同(等于)。如果不匹配,那么我可以从另一列(出院日期)中选择一些随机值

我已经尝试过了,不幸的是,在 visit_end_date 列中得到了一个像“72842”这样的数字。它必须是日期格式。

请注意,数据框中的录取日期格式为“6/8/2169”,出院日期格式为“85466.75694”

DF %>% 
mutate(visit_start_date = as.Date(.$Admit_Date,format = "%m/%d/%Y")) %>%  #dates in raw file are in the format as specified in the code
mutate(visit_end_date = ifelse((.$Enc_Type == 'Outpatient'|.$Enc_Type == 'Emergency'),visit_start_date, as.Date(.$Discharge_Date,origin ='1970-01-01')))} 

我希望在 visit_start_date 和 visit_end_date 列中的输出都是“2169-06-08”。目前,visit_start_date 为“2169-06-08”,visit_end_date 为 72842,如下图所示。

请找到dput命令输出

结构(列表(Admit_Date = c(“6/8/2169 9:40”,“6/8/2169 9:41”, “6/8/2169 9:42”、“7/24/2169 8:51”、“9/12/2169 10:30”、“6/19/2237 12:15”、 “6/19/2237 12:15”、“6/19/2237 12:15”、“4/27/2238 14:07”、“4/27/2238 14:07” ), Discharge_Date = c(85466.75694, 85466.75694, 85466.75694, 85466.75694、85466.75694、85466.75694、85466.75694、85466.75694、 85466.75694, 85466.75694), Discharge_Disposition = c(NA_character_, NA_character_,NA_character_,NA_character_,NA_character_,NA_character_, NA_character_,NA_character_,NA_character_,NA_character_), Enc_Type = c("门诊", "门诊", "门诊", "门诊", “门诊”、“门诊”、“门诊”、“门诊”、“门诊”、 "门诊"), Service = c("OVS / Eye", "Med / DM", "Med / DM", “Med / Renal”、“Med / DM”、“Dental / Dental Surg”、“Dental / Dental Surg”、 “牙科 / 牙科外科”、“OVS / 眼睛”、“OVS / 眼睛”)), row.names = c(NA, -10L), class= c("tbl_df", "tbl", "data.frame"))

【问题讨论】:

  • 您确定日期转换正确吗?你真的在看未来 150-200 年的数据吗?
  • 是的。它是故意这样做的。但问题出在上面的代码上,我在 Visit_end_date 中没有得到相同的值

标签: r timestamp purrr dplyr


【解决方案1】:

以下是我将如何重写您的代码。请注意,您不需要在mutate 中使用.$,您可以只使用列名。此外,您可以在单个 mutate 中运行多个语句。

使用Date 类对象,ifelse 可以删除必要的属性。 dplyr::if_else 做得很好:

DF %>%
  #dates in raw file are in the format as specified in the code
  mutate(
    visit_start_date = as.Date(Admit_Date, format = "%m/%d/%Y"),
    Discharge_Date = as.Date(Discharge_Date, origin = '1970-01-01'),
    visit_end_date = if_else(
      Enc_Type %in% c('Outpatient', 'Emergency'),
      visit_start_date,
      Discharge_Date
    )
  )
# # A tibble: 10 x 7
#    Admit_Date    Discharge_Date Discharge_Disposit~ Enc_Type Service       visit_start_date visit_end_date
#    <chr>         <date>         <chr>               <chr>    <chr>         <date>           <date>
#  1 6/8/2169 9:40 2204-01-01     NA                  Outpati~ OVS / Eye     2169-06-08       2169-06-08
#  2 6/8/2169 9:41 2204-01-01     NA                  Outpati~ Med / DM      2169-06-08       2169-06-08
#  3 6/8/2169 9:42 2204-01-01     NA                  Outpati~ Med / DM      2169-06-08       2169-06-08
#  4 7/24/2169 8:~ 2204-01-01     NA                  Outpati~ Med / Renal   2169-07-24       2169-07-24
#  5 9/12/2169 10~ 2204-01-01     NA                  Outpati~ Med / DM      2169-09-12       2169-09-12
#  6 6/19/2237 12~ 2204-01-01     NA                  Outpati~ Dental / Den~ 2237-06-19       2237-06-19
#  7 6/19/2237 12~ 2204-01-01     NA                  Outpati~ Dental / Den~ 2237-06-19       2237-06-19
#  8 6/19/2237 12~ 2204-01-01     NA                  Outpati~ Dental / Den~ 2237-06-19       2237-06-19
#  9 4/27/2238 14~ 2204-01-01     NA                  Outpati~ OVS / Eye     2238-04-27       2238-04-27
# 10 4/27/2238 14~ 2204-01-01     NA                  Outpati~ OVS / Eye     2238-04-27       2238-04-27

我无法对此进行测试,因为您没有提供示例输入。如果它不起作用,请编辑您的问题以包含一些示例数据dput 共享,例如dput(droplevels(DF[1:10, ]))。然后我可以测试这些数据并尝试找出问题所在。

【讨论】:

  • 我仍然得到我的问题中提到的意外输出。将尝试上传示例数据
  • 问题显然是ifelse。它似乎删除了 Date 属性。如果我们切换到dplyr::if_else,它就可以工作。
  • 可以帮我写这篇文章吗? stackoverflow.com/questions/61269745/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-23
  • 2012-05-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多