在日期上使用dplyr::if_else()
,我想返回一个NA
-但R中没有NA_date_
或NA_double_
(我知道-或列出了{ {3}})?如何执行以下代码:
ep <- df %>%
group_by(id, episode) %>%
summarise(ep_adm = min(adm, na.rm = T),
ep_sepa = if_else(all(is.na(sepa)),
if_else(all(is.na(adm)), NA, max(adm, na.rm = T)),
max(sepa, na.rm = T)))
没有错误吗?
summarise_impl(.data,点)中的错误:评估错误:
false
必须为逻辑类型,不能为double。
此问题的动机是将每个患者ID的行分类为一次护理(数据来自不同的数据源,其中一个不包含sepa
日期),即由group_by()
处理。然后,我想获取剧集的开始日期和结束日期ep_adm
和ep_sepa
。规则是,如果所有的离职日期都是NA
,那么将使用最后的入学日期,否则应使用最后的离职日期。
预期输出中的代码有效,但我希望删除最后两行代码(使用dplyr::if_else()
,因为此应该返回一个<date>
对象)。
ep <- df %>%
group_by(id, episode) %>%
summarise(ep_adm = min(adm, na.rm = T),
ep_sepa = ifelse(all(is.na(sepa)),
ifelse(all(is.na(adm)), NA, max(adm, na.rm = T)),
max(sepa, na.rm = T)))
ep$ep_adm <- as.Date(ep$ep_adm, origin = "1970-01-01")
ep$ep_sepa <- as.Date(ep$ep_sepa, origin = "1970-01-01")
# # A tibble: 4 x 4
# # Groups: id [?]
# id episode ep_adm ep_sepa
# <dbl> <int> <date> <date>
# 1 1 1 2002-06-28 2002-07-05
# 2 1 2 2002-08-25 2002-08-25
# 3 1 3 2003-06-26 2003-06-26
# 4 1 4 2007-04-10 2007-04-11
left_join(df, ep, by = c("id", "episode"))
# # A tibble: 8 x 6
# id episode adm sepa ep_adm ep_sepa
# <dbl> <int> <date> <date> <date> <date>
# 1 1 1 2002-06-28 NA 2002-06-28 2002-07-05
# 2 1 1 2002-06-28 NA 2002-06-28 2002-07-05
# 3 1 1 2002-06-28 2002-07-05 2002-06-28 2002-07-05
# 4 1 1 2002-06-28 2002-07-05 2002-06-28 2002-07-05
# 5 1 2 2002-08-25 NA 2002-08-25 2002-08-25
# 6 1 3 2003-06-26 NA 2003-06-26 2003-06-26
# 7 1 4 2007-04-10 NA 2007-04-10 2007-04-11
# 8 1 4 2007-04-10 2007-04-11 2007-04-10 2007-04-11
df <- structure(list(id = c(1, 1, 1, 1, 1, 1, 1, 1), episode = c(1L,
1L, 1L, 1L, 2L, 3L, 4L, 4L), adm = structure(c(11866, 11866,
11866, 11866, 11924, 12229, 13613, 13613), class = "Date"), sepa = structure(c(NA,
NA, 11873, 11873, NA, NA, NA, 13614), class = "Date")), row.names = c(NA,
-8L), class = c("tbl_df", "tbl", "data.frame"))
答案 0 :(得分:2)
编辑
对于更新后的数据集,看来我们可以只将return f"{nom} {dat and '(%s)' % dat}. {tit}. {jou}. {pbm and 'Pubmed: ' + pbm}"
和max
列中的sepa
日期取整。
adm
原始答案
如果我正确理解了您的代码,则可以使用df %>%
group_by(id, episode) %>%
summarise(ep_adm = min(adm, na.rm = T),
ep_sepa = max(c(sepa, adm), na.rm = TRUE))
# id episode ep_adm ep_sepa
# <dbl> <int> <date> <date>
#1 1 1 2002-06-28 2002-07-05
#2 1 2 2002-08-25 2002-08-25
#3 1 3 2003-06-26 2003-06-26
#4 1 4 2007-04-10 2007-04-11
来简化代码。在coalesce
列中,我们从ep_sepa
和max(sepa)
列中获得第一个非NA条目。
max(adm)