使用ifelse和dplyr维护POSIXct时间格式
问题描述:
下面的数据有两个人的观察日期。使用ifelse和dplyr维护POSIXct时间格式
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"), 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", "SurveyID", "SurveyDt"), class = "data.frame")
> dat
GenIndID IndID Fate SurveyID SurveyDt
1 BHS_034 BHS_034_A Mort GYA13-1 2013-09-19
2 BHS_034 BHS_034_A Mort GYA14-1 2014-08-08
3 BHS_068 BHS_068_A Alive GYA13-1 2013-09-19
4 BHS_068 BHS_068_A Alive GYA14-1 2014-08-08
5 BHS_068 BHS_068_A Alive GYA14-2 2014-09-05
6 BHS_068 BHS_068_A Alive GYA15-1 <NA>
7 BHS_068 BHS_068_A Alive GYA16-1 2016-05-11
8 BHS_068 BHS_068_A Alive GYA16-2 2016-09-20
9 BHS_068 BHS_068_A Alive GYA17-1 2017-05-23
10 BHS_068 BHS_068_A Alive GYA17-3 2017-10-03
11 BHS_068 BHS_068_A Alive GYA15-2 2015-09-11
的SurveyDt列被格式化为POSIXct
时间戳。我试图总结GenIndID
组中的最大日期为dplyr
。在下面的代码中,我使用dplyr
来创建两个新列。对于AAA
为什么<NA>
为第二个人生产时,最大功能使用na.rm = F
参数?对于BBB
,我想总结活着个体的最大值,但获得所有的NA
值(确认为因子而不是<NA>
,这是首选)。
dat %>% group_by(GenIndID) %>%
mutate(AAA = max(SurveyDt, na.rm = FALSE),
BBB = ifelse(Fate == "Alive", max(SurveyDt, na.rm = F), NA)) %>%
as.data.frame()
GenIndID IndID Fate SurveyID SurveyDt AAA BBB
1 BHS_034 BHS_034_A Mort GYA13-1 2013-09-19 2014-08-08 NA
2 BHS_034 BHS_034_A Mort GYA14-1 2014-08-08 2014-08-08 NA
3 BHS_068 BHS_068_A Alive GYA13-1 2013-09-19 <NA> NA
4 BHS_068 BHS_068_A Alive GYA14-1 2014-08-08 <NA> NA
5 BHS_068 BHS_068_A Alive GYA14-2 2014-09-05 <NA> NA
6 BHS_068 BHS_068_A Alive GYA15-1 <NA> <NA> NA
7 BHS_068 BHS_068_A Alive GYA16-1 2016-05-11 <NA> NA
8 BHS_068 BHS_068_A Alive GYA16-2 2016-09-20 <NA> NA
9 BHS_068 BHS_068_A Alive GYA17-1 2017-05-23 <NA> NA
10 BHS_068 BHS_068_A Alive GYA17-3 2017-10-03 <NA> NA
11 BHS_068 BHS_068_A Alive GYA15-2 2015-09-11 <NA> NA
>
答
让我们试试这个
dat %>% group_by(GenIndID) %>%
mutate(AAA = max(SurveyDt, na.rm=T),
BBB = as.POSIXct(ifelse(Fate == "Alive", max(SurveyDt, na.rm=T), NA), origin='1970-01-01', na.rm=T)) %>%
as.data.frame()
希望这有助于!
非常感谢@Prem。为什么为BBB添加'as.POSIXct'包装会改变AAA的结果? –
@ B.Davis很高兴它帮助!按照您的要求,AAA列对于每个GenIndID组具有最大的SurveyDt,对于Fate == Alive只有'BBB'列具有最大的SurveyDt。这里添加了'as.POSIXct',因为'BBB'中的'ifelse'条件将时间转换为UNIX历元,但所需的输出格式不同。 – Prem