按组创建日期不同的条件

时间:2018-03-26 15:03:10

标签: r dplyr

我正在尝试为独特的人(由id定义)创建一个标志,其飞行持续时间超过14小时,并且在14小时飞行后他们有另一个航班大于或等于25天。

为了解决这个问题,我决定使用if-else语句,其中按行分组的最大日期按行日期减去,但标记仅适用于第一次飞行超过14小时的情况。

#Setup Data Frame
id <- c(1,1,2,2,3,3,4,4,4,4,5,5)
flght_dur <- c(27,13,13,17,19,12,7,9,27,14,13,45)
flght_dt <- as.Date(c("2016-03-29","2016-09-01","2015-07-23","2016-06-16","2015-11-12","2016-03-25","2015-12-23","2016-05-19","2016-08-18","2016-09-27","2016-08-18","2016-09-27"))
df <- data.frame(id, flght_dur, flght_dt)

df2 <- df %>% group_by(id) %>% mutate(flag = ifelse(flght_dur >= 14  && (max(as.Date(flght_dt)) -  as.Date(flght_dt)) >= 25, 1,0))
df2

对于下一步的任何建议都表示赞赏,

3 个答案:

答案 0 :(得分:1)

您正在使用带有向量的标量条件&&,它们只会查看向量的第一个元素;要查看所有可能的条件并返回每个组的标量,可以对向量使用&,然后使用any来减少布尔结果:

df2 <- df %>% 
    group_by(id) %>% 
    mutate(flag = +any(flght_dur >= 14 & max(as.Date(flght_dt)) -  as.Date(flght_dt) >= 25))
    #             ^ used + here to convert boolean to 1 and 0 instead of if/else for short

df2
# A tibble: 12 x 4
# Groups:   id [5]
#      id flght_dur flght_dt    flag
#   <dbl>     <dbl> <date>     <int>
# 1    1.       27. 2016-03-29     1
# 2    1.       13. 2016-09-01     1
# 3    2.       13. 2015-07-23     0
# 4    2.       17. 2016-06-16     0
# 5    3.       19. 2015-11-12     1
# 6    3.       12. 2016-03-25     1
# 7    4.        7. 2015-12-23     1
# 8    4.        9. 2016-05-19     1
# 9    4.       27. 2016-08-18     1
#10    4.       14. 2016-09-27     1
#11    5.       13. 2016-08-18     0
#12    5.       45. 2016-09-27     0

答案 1 :(得分:1)

尝试使用data.table链接,如下所示:

DF[, longHaul := ifelse(flght_dur > 14, TRUE, FALSE)][, maxFlight_DATE := max(flght_dt), by = "id"][longHaul == TRUE & (maxFlight_DATE - flght_dt > 25),]

这是在使用data.frame

data.table转换为DF = data.table(df)之后

它给了我以下输出,它看起来符合你想要的逻辑。

   id flght_dur   flght_dt longHaul maxFlight_DATE
1:  1        27 2016-03-29     TRUE     2016-09-01
2:  3        19 2015-11-12     TRUE     2016-03-25
3:  4        27 2016-08-18     TRUE     2016-09-27

答案 2 :(得分:1)

您可以使用rollapply避免循环,如下所示。

df$sameid <- c(rollapply(df$id, width = 2, by = 1, FUN = function(x) x[1]==x[2] , align = "right"),NA)
df$nextdurcondition <- c(diff(df$flght_dt)>25 ,NA)
df$flag <- df$sameid &df$nextdurcondition
df

但是,对于这些滚动功能,我个人总是使用循环