在R

时间:2019-03-26 20:01:28

标签: r dplyr timestamp purrr mutate

我有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,如下面的屏幕快照所示。

enter image description here

请找到dput命令输出

  

structure(list(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(“门诊病人”,“门诊病人”,“门诊病人”,“门诊病人”,       “门诊”,“门诊”,“门诊”,“门诊”,“门诊”,       “门诊”),服务= c(“ OVS /眼”,“ Med / DM”,“ Med / DM”,       “ Med / Renal”,“ Med / DM”,“ Dental / Dent Surg”,“ Dental / Dent Surg”,       “ Dental / Dental Surg”,“ OVS / Eye”,“ OVS / Eye”))),row.names = c(NA,   -10L),class = c(“ tbl_df”,“ tbl”,“ data.frame”))

1 个答案:

答案 0 :(得分: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, ]))。然后,我可以对这些数据进行测试,并尝试找出问题所在。