使用ifelse从另一个基于日期的列生成日期,并在R中进行变异
我有两个输入列,例如访问开始日期、访问类型和一个输出列-访问结束日期 我需要根据以下条件填写“就诊\结束\日期”列的值 如果就诊类型列的值为“门诊”或“急诊”,则就诊结束日期与就诊开始日期相同(相等)。如果它不匹配,那么我可以从另一列(出院日期)中选择一些随机值 我已经试过了,不幸的是,在访问结束日期列中得到了一个像“72842”这样的值。它必须是日期格式 请注意,数据框中的入院日期格式为“6/8/2169”,出院日期格式为“85466.75694”使用ifelse从另一个基于日期的列生成日期,并在R中进行变异,r,dplyr,timestamp,purrr,mutate,R,Dplyr,Timestamp,Purrr,Mutate,我有两个输入列,例如访问开始日期、访问类型和一个输出列-访问结束日期 我需要根据以下条件填写“就诊\结束\日期”列的值 如果就诊类型列的值为“门诊”或“急诊”,则就诊结束日期与就诊开始日期相同(相等)。如果它不匹配,那么我可以从另一列(出院日期)中选择一些随机值 我已经试过了,不幸的是,在访问结束日期列中得到了一个像“72842”这样的值。它必须是日期格式 请注意,数据框中的入院日期格式为“6/8/2169”,出院日期格式为“85466.75694” DF %>% mutate(visi
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')))}
我希望访问开始日期和访问结束日期列的输出都是“2169-06-08”。目前,访问开始日期为“2169-06-08”,访问结束日期为72842,如下面的屏幕截图所示
请查找dput命令输出
结构(列表(录取日期=c(“6/8/2169:40”、“6/8/2169: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"
),出院日期=c(85466.75694,85466.75694,85466.75694,
85466.75694, 85466.75694, 85466.75694, 85466.75694, 85466.75694,
85466.75694,85466.75694),出院处置=c,
NA_字符,NA_字符,NA_字符,NA_字符,NA_字符,NA_字符,
NA_字符,NA_字符,NA_字符,NA_字符,
Enc_Type=c(“门诊”、“门诊”、“门诊”、“门诊”,
“门诊”、“门诊”、“门诊”、“门诊”、“门诊”,
“门诊”),服务=c(“OVS/Eye”、“Med/DM”、“Med/DM”,
“医学/肾脏”、“医学/糖尿病”、“牙科/牙科外科”、“牙科/牙科外科”,
“牙科/牙科手术”、“OVS/眼睛”、“OVS/眼睛”)),行名称=c(NA,
-10L),类=c(“待定”、“待定”、“数据帧”))
下面是我将如何重新编写您的代码。请注意,您不需要在
mutate
中使用$
,只需使用列名即可。此外,您还可以在一个mutate
中运行多个语句
使用Date
类对象,ifelse
可以删除必要的属性dplyr::如果其他方面做得很好:
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
DF%>%
#原始文件中的日期采用代码中指定的格式
变异(
访问开始日期=截止日期(接纳日期,格式=“%m/%d/%Y”),
出院日期=截止日期(出院日期,原产地='1970-01-01'),
访问结束日期=如果其他(
%c(“门诊”、“急诊”)中的附件类型%,
访问开始日期,
出院日期
)
)
##tibble:10 x 7
#入院日期出院日期出院处理~Enc类型服务就诊开始日期就诊结束日期
#
#1 6/8/2169:40 2204-01-01 NA输出~OVS/眼睛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门诊~Med/Renal 2169-07-24 2169-07-24
#5 9/12/216910~2204-01-01 NA门诊~Med/DM 2169-09-12 2169-09-12
#6 6/19/2237 12~2204-01-01 NA Outpati~DETAL/Den~2237-06-19 2237-06-19
#7 6/19/2237 12~2204-01-01 NA Outpati~DETAL/Den~2237-06-19 2237-06-19
#8 6/19/2237 12~2204-01-01 NA Outpati~DETAL/Den~2237-06-19 2237-06-19
#9 4/27/2238 14~2204-01-01 NA输出~OVS/眼睛2238-04-27 2238-04-27
#10 4/27/2238 14~2204-01-01 NA输出~OVS/眼睛2238-04-27 2238-04-27
我无法对此进行测试,因为您没有提供示例输入。如果它不起作用,请编辑您的问题,以包括与dput
共享的一些示例数据,例如dput(液滴液位(DF[1:10,])
。然后,我可以测试这些数据,并尝试找出哪里出了问题。您确定日期转换正确吗?你真的在看未来150-200年的数据吗?是的。这是故意这样做的。但是问题在于上面的代码,我在Visit\u end\u date中没有得到相同的值,我仍然得到了问题中提到的意外输出。将尝试上载示例数据问题显然是ifelse
。它似乎删除了日期属性。如果我们切换到dplyr::If_else
它可以工作。请帮我写这篇文章好吗?