根据多种条件(时间间隔)进行突变(dplyr)

时间:2018-08-24 19:00:57

标签: r dplyr conditional posixct mutate

我正在努力对我拥有的2个数据集进行条件合并。

第一个具有以下结构

 ID   Trip number       Time start             Time Stop       
  1        1        2018-04-10 14:44:38   2018-04-10 14:44:38  
  1        2        2018-04-10 16:28:08   2018-04-10 16:46:17  
  2        1        2018-04-10 22:47:56   2018-04-10 23:26:24  

第二个有这个

 ID   Status          Time             
  1       a        2018-04-10 14:44:38     
  1       b        2018-04-10 16:28:08     
  2       c        2018-04-10 22:47:56     

我正在尝试为第一个df1创建一个新列,其中包含在第二个df2中找到的每个ID的最短时间,该时间位于每个ID行程的开始时间和停止时间之间。另外,我为间隔增加了900秒,以使其更宽。

到目前为止,我的代码看起来像

try <- df1 %>%
  group_by(ID, Trip.number)  %>%
  mutate(ifelse((df1$Time.Start - 900) >= df2$Time & (df1$Time.Stop + 900) <= df2$Time & df1$ID %in% df2$ID), df2$Time, 0) 

最后它给我警告(两个数据集的长度不同)

  

评估错误:参数“ no”丢失,没有默认值。       另外:警告消息:
      1:在>=.default(df1 $ Time.Start-900,df2 $ Time)中:       较长的对象长度不是较短的对象长度的倍数
      2:在<=.default(df1 $ Time.Start + 900,df2 $ Time)中:       较长的物体长度不是较短的物体长度的倍数

时间转换为POSIXct

可复制的示例

df1 <- data.table(ID = c(1,1,1,2,2,3,3,3,4,5,5,5),
             Trip.number = c(1,2,3,1,2,1,2,3,1,1,2,3), 
             Time.start = as.POSIXct(c("2018-04-10 14:44:38", "2018-04-10 16:28:08", 
                                       "2018-04-10 17:31:54", "2018-04-10 13:29:33", 
                                       "2018-04-10 22:47:56", "2018-04-10 10:03:15", 
                                       "2018-04-10 18:00:23", "2018-04-10 19:56:04", 
                                       "2018-04-10 08:52:00", "2018-04-10 09:54:50", 
                                       "2018-04-10 14:51:04", "2018-04-10 18:34:01")),
             Time.stop = as.POSIXct(c("2018-04-10 15:30:59","2018-04-10 16:46:17",
                                      "2018-04-10 18:03:36", "2018-04-10 13:52:35",
                                      "2018-04-10 23:26:24", "2018-04-10 10:39:23",
                                      "2018-04-10 18:03:37", "2018-04-10 20:29:13",
                                      "2018-04-10 09:05:08", "2018-04-10 10:31:54",
                                      "2018-04-10 15:00:41", "2018-04-10 19:04:10")))

df2 <- data.table(ID=c(1,1,2,2,2,2,4,5,6,7,8,9),
              Time =  as.POSIXct(c("2018-04-10 18:34:01",
                                   "2018-04-10 19:04:10",
                                   "2018-04-10 12:07:35",
                                   "2018-04-10 12:13:59",
                                   "2018-04-10 11:06:00",
                                   "2018-04-10 11:46:20",
                                   "2018-04-10 18:56:51",
                                   "2018-04-10 19:10:03",
                                   "2018-04-10 09:06:06",
                                   "2018-04-10 09:29:04",
                                   "2018-04-10 18:04:47",
                                   "2018-04-10 18:21:24")))

先谢谢您!

1 个答案:

答案 0 :(得分:1)

小样本数据集会很有用,但是我认为您只需要在操作周围加上括号

mutate(ifelse( (df1$Time.Start - 900) >= df2$Time & (df1$Time.Stop + 900) <= df2$Time & df1$ID %in% df2$ID), df2$Time, 0)