我有两个数据框需要连接。但在连接这两个数据表时,我希望复制开始时间和结束时间内df2
的每一行。新数据框的其余行应显示为NA
。
我尝试使用left join
,但它不复制开始和结束时间内的行。
df <- dplyr::left_join(df1, df2, by = "Session_start")
两个数据框如下所示。
head(df1)
# Session_start Robot_ID
# 1 2022-07-07 00:05:19 R1
# 2 2022-07-07 00:05:20 R2
# 3 2022-07-07 00:05:21 R3
# 4 2022-07-07 00:05:22 R4
# 5 2022-07-07 00:05:23 R5
# 6 2022-07-07 00:05:24 R6
df2
# Session_start Session_End Animal_ID
# 1 2022-07-07 00:05:19 2022-07-07 00:05:21 ID1
# 2 2022-07-07 00:05:24 2022-07-07 00:05:26 ID2
# 3 2022-07-07 00:05:27 2022-07-07 00:05:31 ID3
# 4 2022-07-07 00:05:33 2022-07-07 00:05:34 ID4
所需输出为:
| 会话开始(_S)|机器人_ID|工作阶段结束(_E)|动物ID|
| - -|- -|- -|- -|
| 2022年7月7日00:05:19| R1接口|2022年7月7日00:05:21|识别码1|
| 2022年7月7日00:05:20| R2接口|2022年7月7日00:05:21|识别码1|
| 2022年7月7日00:05:21|第三代|2022年7月7日00:05:21|识别码1|
| 2022年7月7日00:05:22|第四章|不适用|不适用|
| 2022年7月7日00:05:23|第五章|不适用|不适用|
| 2022年7月7日00:05:24| R6接口|2022年7月7日00:05:26|识别码1|
| 2022年7月7日00:05:25|第七章|2022年7月7日00:05:26|识别码2|
| 2022年7月7日00:05:26| R8系列|2022年7月7日00:05:26|识别码2|
| 2022年7月7日00:05:27|第九章|2022年7月7日00:05:31| ID 3识别码|
| 2022年7月7日00:05:28|第十章|2022年7月7日00:05:31| ID 3识别码|
| 2022年7月7日00:05:29|第十一章|2022年7月7日00:05:31| ID 3识别码|
| 2022年7月7日00:05:30|第十二章|2022年7月7日00:05:31| ID 3识别码|
| 2022年7月7日00:05:31|第十三章|2022年7月7日00:05:31| ID 3识别码|
| 2022年7月7日00:05:32|十四|不适用|不适用|
| 2022年7月7日00:05:33|十五|2022年7月7日00:05:34| ID 4识别码|
| 2022年7月7日00:05:34|十六|2022年7月7日00:05:34| ID 4识别码|
我如何使用R来做这件事?
数据
df1 <- data.frame(Session_start=c("2022-07-07 00:05:19", "2022-07-07 00:05:20", "2022-07-07 00:05:21",
"2022-07-07 00:05:22", "2022-07-07 00:05:23", "2022-07-07 00:05:24",
"2022-07-07 00:05:25", "2022-07-07 00:05:26", "2022-07-07 00:05:27",
"2022-07-07 00:05:28", "2022-07-07 00:05:29", "2022-07-07 00:05:30",
"2022-07-07 00:05:31", "2022-07-07 00:05:32", "2022-07-07 00:05:33",
"2022-07-07 00:05:34"),
Robot_ID =c("R1", "R2", "R3", "R4", "R5", "R6", "R7", "R8", "R9", "R10",
"R11", "R12", "R13", "R14", "R15", "R16"))
df2 <- data.frame(Session_start=c("2022-07-07 00:05:19", "2022-07-07 00:05:24",
"2022-07-07 00:05:27", "2022-07-07 00:05:33"),
Session_End=c("2022-07-07 00:05:21", "2022-07-07 00:05:26",
"2022-07-07 00:05:31", "2022-07-07 00:05:34"),
Animal_ID =c("ID1", "ID2", "ID3", "ID4"))
4条答案
按热度按时间c8ib6hqw1#
k10s72fa2#
首先,使用
outer()
找到索引w
,其中df
的会话开始位于df2
的会话间隔之间。接下来,使用cbind
将它们分配到相应的切片。最后,使用merge
计算余数。**注意:**即使解决方案不使用
"POSIXct"
(日期是按字母顺序比较的),您在使用日期时间时也应该始终使用"POSIXct"
。如果您还没有"POSIXct"
,请转换它:3yhwsihp3#
这个答案比邮件和jay.sf的要长得多,但我还是会把它贴出来,这样你就有更多的想法了。
我的方法是使用辅助变量,使用lubridate来确保我使用的是正确的格式,然后开始传播Animal_ID和Session_End数据。
ttisahbt4#
这是我的答案。它有点简单,但它可以很好地用于您的数据集: