我正在努力对我拥有的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")))
先谢谢您!
答案 0 :(得分:1)
小样本数据集会很有用,但是我认为您只需要在操作周围加上括号
mutate(ifelse( (df1$Time.Start - 900) >= df2$Time & (df1$Time.Stop + 900) <= df2$Time & df1$ID %in% df2$ID), df2$Time, 0)