dplyr ifelse声明中的嵌套条件
我使用dplyr
和ifelse
创建一个基于两个条件的新列,其数据如下。dplyr ifelse声明中的嵌套条件
dat <- structure(list(GenIndID = c("BHS_034", "BHS_034", "BHS_068",
"BHS_068", "BHS_068", "BHS_068", "BHS_068", "BHS_068", "BHS_068",
"BHS_068", "BHS_068"), IndID = c("BHS_034_A", "BHS_034_A", "BHS_068_A",
"BHS_068_A", "BHS_068_A", "BHS_068_A", "BHS_068_A", "BHS_068_A",
"BHS_068_A", "BHS_068_A", "BHS_068_A"), Fate = c("Mort", "Mort",
"Alive", "Alive", "Alive", "Alive", "Alive", "Alive", "Alive",
"Alive", "Alive"), Status = c("Alive", "Mort", "Alive", "Alive",
"MIA", "Alive", "MIA", "Alive", "MIA", "Alive", "Alive"), Type = c("Linked",
"Linked", "SOB", "SOB", "SOB", "SOB", "SOB", "SOB", "SOB", "SOB",
"SOB"), SurveyID = c("GYA13-1", "GYA14-1", "GYA13-1", "GYA14-1",
"GYA14-2", "GYA15-1", "GYA16-1", "GYA16-2", "GYA17-1", "GYA17-3",
"GYA15-2"), SurveyDt = structure(c(1379570400, 1407477600, 1379570400,
1407477600, 1409896800, NA, 1462946400, 1474351200, 1495519200,
1507010400, 1441951200), tzone = "", class = c("POSIXct", "POSIXt"
))), row.names = c(NA, 11L), .Names = c("GenIndID", "IndID",
"Fate", "Status", "Type", "SurveyID", "SurveyDt"), class = "data.frame")
> dat
GenIndID IndID Fate Status Type SurveyID SurveyDt
1 BHS_034 BHS_034_A Mort Alive Linked GYA13-1 2013-09-19
2 BHS_034 BHS_034_A Mort Mort Linked GYA14-1 2014-08-08
3 BHS_068 BHS_068_A Alive Alive SOB GYA13-1 2013-09-19
4 BHS_068 BHS_068_A Alive Alive SOB GYA14-1 2014-08-08
5 BHS_068 BHS_068_A Alive MIA SOB GYA14-2 2014-09-05
6 BHS_068 BHS_068_A Alive Alive SOB GYA15-1 <NA>
7 BHS_068 BHS_068_A Alive MIA SOB GYA16-1 2016-05-11
8 BHS_068 BHS_068_A Alive Alive SOB GYA16-2 2016-09-20
9 BHS_068 BHS_068_A Alive MIA SOB GYA17-1 2017-05-23
10 BHS_068 BHS_068_A Alive Alive SOB GYA17-3 2017-10-03
11 BHS_068 BHS_068_A Alive Alive SOB GYA15-2 2015-09-11
更具体地说,GenIndID
分组我想要一个新的日期字段是基于两个条件语句为Type
和Fate
最大SurveyDt
。此外,我希望最大日期仅在Status == Alive
时评估SurveyDt
。我的代码如下生成所有NA
值,而不是所有符合所有指定条件的BHS_068
的描述日期字段。
我最近看到case_when
这可能适合在这里,但我无法正确实施它。
dat %>% group_by(GenIndID) %>%
mutate(NewDat = as.POSIXct(ifelse(Type == "SOB" & Fate == "Alive", max(SurveyDt[Status == "Alive"], na.rm = F), NA),
origin='1970-01-01', na.rm=T)) %>%
as.data.frame()
任何意见,将不胜感激。
如果您想坚持使用dplyr
并使用case_when
您必须确保每个case语句的值都是相同的类型。
在这种情况下,您的TRUE值将是datetime,因此您必须将默认值设置为datetime,并将其包装在as.POSIXct
中。
dat %>%
group_by(GenIndID) %>%
mutate(NewDat = case_when(Type == "SOB" & Fate == "Alive" ~ max(SurveyDt[Status == "Alive"], na.rm = TRUE),
TRUE ~ as.POSIXct(NA, origin = "1970-01-01")))
使用ifelse
dat %>%
group_by(GenIndID) %>%
mutate(NewDat = ifelse(Type == "SOB" & Fate == "Alive",
max(SurveyDt[Status == "Alive"], na.rm = TRUE),
as.POSIXct(NA, origin = "1970-01-01")))
因为我更熟悉该语法,所以如果ifelse可能会出现相同的结果,那么我不会绑定到'case_when'。 –
对于'case_when'是'TRUE〜as.POSIXct(NA,origin =“1970-01-01”''提供'ifelse'的else部分?也就是说,对于指定条件没有得到满足,我无法从帮助文件中解释这一点(用我的能力......)。 –
我们可以使用data.table
。在转换为data.table(setDT(dat)
)后,指定i
作为逻辑比较,按'GenIndID'分组,我们将'SurveyDt'的max
分配给'NewDat','Status'为'NewDat'
library(data.table)
setDT(dat)[Type == "SOB" & Fate == "Alive",
NewDat := max(SurveyDt[Status == "Alive"], na.rm = TRUE), GenIndID]
你能提供出所需的输出如何看起来像一个桌子? – Cris