R 根据时间戳连接两个数据集并组合它们的描述符变量

R 根据时间戳连接两个数据集并组合它们的描述符变量,r,join,merge,dplyr,tidyverse,R,Join,Merge,Dplyr,Tidyverse,我有两个类似于这些示例数据的数据帧(df1和df2)。我需要连接两个数据集以获取两个数据帧df1和df2,并组合它们的描述符变量(运动),以便在任何状态发生变化时,在df1上创建一个新记录: 这里的目的是将运动状态变量添加到每个查看间隔中,我希望得到以下结果: date id viewing_start viewing_end motion 2019-01-01 18404885 155900 155959 ON 2019-01-01 18404885 16040

我有两个类似于这些示例数据的数据帧(df1和df2)。我需要连接两个数据集以获取两个数据帧df1和df2,并组合它们的描述符变量(运动),以便在任何状态发生变化时,在df1上创建一个新记录:

这里的目的是将运动状态变量添加到每个查看间隔中,我希望得到以下结果:

date    id  viewing_start   viewing_end motion
2019-01-01  18404885    155900  155959  ON
2019-01-01  18404885    160400  160859  ON
2019-01-01  18404885    170100  170259  ON
2019-01-01  18404885    170400  170459  ON
2019-01-01  18404885    170500  171259  ON
2019-01-08  18404885    201100  201859  idle
我的数据集(viweing_开始、查看_结束、开始_时间和结束_时间)最初是H:M:S格式(时间)

df1%
mutate(查看开始=anytime::anytime(粘贴0(日期,”,查看开始),tz=“CET”),
查看结束=随时::随时(粘贴0(日期,“,查看结束),tz=“CET”))
df2%
mutate(start_time=paste0(date,“,as.character(start_time)),
结束时间=粘贴0(日期,“,作为.character(结束时间)))%>%
变异(开始时间=任何时间::任何时间(开始时间),
结束时间=任何时间::任何时间(结束时间))

我猜您想根据开始时间和查看开始时间加入集合,对吗?那么这些集合的加入格式应该相同。是的,有点。这就是问题所在。因为我的数据集中的时间是从03:00:00开始到26:00:00(凌晨3点到第二天凌晨3点)。我还没有找到任何函数来处理这个奇怪的时间格式。不清楚你是如何得到这个结果的。你能再解释一下吗?开始时间和查看开始时间之间有什么关系?你怎么知道哪个条目与哪个条目相匹配?@ArthurYip我的目标是将df2中的运动列添加到df1数据表中。比如说,对于每个记录在df1中,查看时间/查看结束间隔发生在df2报告运动状态--“打开”、“空闲”或“停止”时"关闭---根据相应的时间跨度间隔,您可以在fuzzyjoin包中尝试fuzzy_join和interval_join。这将允许您使用不精确的匹配来连接数据帧。您不能使用常规连接,因为R不知道您希望每个df1使用df2中的哪一行。我猜您希望根据开始时间和查看来连接集合_开始正确吗?那么这些to对于联接应该采用相同的格式。是的,有点。这就是问题所在。因为我的数据集中的时间是从03:00:00开始到26:00:00(凌晨3点到第二天凌晨3点)。我还没有找到任何函数来处理这个奇怪的时间格式。不清楚你是如何得到这个结果的。你能再解释一下吗?开始时间和查看开始时间之间有什么关系?你怎么知道哪个条目与哪个条目相匹配?@ArthurYip我的目标是将df2中的运动列添加到df1数据表中。比如说,对于每个记录在df1中,查看时间/查看结束间隔发生在df2报告运动状态--“打开”、“空闲”或“停止”时“OFF--根据相应的时间跨度间隔,您可以在fuzzyjoin包中尝试fuzzy_join和interval_join。这将允许您使用不精确匹配来连接数据帧。您不能使用常规连接,因为R不知道每个df1要从df2中选择哪一行。
   df1 <- data.frame(
  date = c("2019-01-01", "2019-01-01", "2019-01-01", "2019-01-01",
           "2019-01-01", "2019-01-08", "2019-01-08", "2019-01-08",
           "2019-01-08", "2019-01-08", "2019-01-08", "2019-01-08",
           "2019-01-08", "2019-01-08", "2019-01-08", "2019-01-08",
           "2019-01-08", "2019-01-08", "2019-01-08"),
  id = c(18404885, 18404885, 18404885, 18404885, 18404885,
         18404885, 18404885, 18404885, 18404885, 18404885,
         18404885, 18404885, 18404885, 18404885, 18404885, 18404885,
         18404885, 18404885, 18404885),
  viewing_start = c(155900, 160400, 170100, 170400, 170500, 201100, 202000,
                    203300, 203700, 204100, 204900, 205200, 205600, 210000,
                    210200, 210800, 211700, 212400, 212900),
  viewing_end = c(155959, 160859, 170259, 170459, 171259, 201859, 202159,
                  203459, 203859, 204759, 204959, 205259, 205659, 210059,
                  210659, 211659, 211859, 212759, 220259)
) %>% 
  mutate(viewing_start = anytime::anytime(paste0(date," ", viewing_start), tz = "CET"),
         viewing_end = anytime::anytime(paste0(date," ", viewing_end) , tz = "CET")) 


df2 <- data.frame(stringsAsFactors=FALSE,
                  id = c(18404885, 18404885, 18404885, 18404885, 18404885, 18404885,
                         18404885, 18404885, 18404885, 18404885, 18404885),
                  date = c("2019-01-01", "2019-01-01", "2019-01-01", "2019-01-01",
                           "2019-01-01", "2019-01-08", "2019-01-08", "2019-01-08",
                           "2019-01-08", "2019-01-08", "2019-01-08"),
                  start_time = c("030000", "033715", "080615", "225215", "250000",
                                 "030000", "033700", "082915", "204100", "205100",
                                 "220315"),
                  end_time = c("033715", "080615", "225215", "250000", "030000",
                               "033700", "082915", "204100", "205100", "220315",
                               "241245"),
                  motion = c("idle", "idle", "ON", "idle", "idle", "idle", "idle", "ON",
                             "WARN", "OFF", "ON")) %>% 
  mutate( start_time = paste0(date," ", as.character(start_time)),
          end_time = paste0(date," ", as.character(end_time))) %>% 
mutate(start_time = anytime::anytime(start_time),
       end_time = anytime::anytime(end_time))