gpt4 book ai didi

r - 如何在时间列上组合基于 R 数据帧的约束

转载 作者:行者123 更新时间:2023-12-02 06:29:52 25 4
gpt4 key购买 nike

我有两个 R 表,每个表都有一个用户列表和一个与他们采取特定操作的时间相对应的时间戳。

第一个 (df1) 两个表有一个详尽的用户列表,用户将有多个具有不同时间戳的行。

第二个 (df2) 将有一个更有限的用户列表,但用户将再次出现在表中,时间戳不同。

我希望能够做的是连接两个表并最终得到一个与 df1 中的用户匹配的表。与 df2 中最接近的时间戳,只要时间戳在df2发生在df1 中的之后 .

例如,如果我有两个表:

df1 <- data.frame(c(1,1,2,3), as.POSIXct(c('2016-12-01 08:53:20', '2016-12-01 12:45:47', '2016-12-01 15:34:54', '2016-12-01 00:49:50')))
names(df1) <- c('user', 'time')

df2 <- data.frame(c(1,1,3), as.POSIXct(c('2016-12-01 07:11:01', '2016- 12-01 11:50:11', '2016-12-01 01:19:10')))
names(df2) <- c('user', 'time')

给我们:

> df1
user time
1 1 2016-12-01 08:53:20
2 1 2016-12-01 12:45:47
3 2 2016-12-01 15:34:54
4 3 2016-12-01 00:49:50

> df2
user time
1 1 2016-12-01 07:11:01
2 1 2016-12-01 11:50:11
3 3 2016-12-01 01:19:10

我希望得到的输出如下所示:

user              time_1                 time_2
1 2016-12-01 08:53:20 2016-12-01 11:50:11
1 2016-12-01 12:45:47 NA
2 2016-12-01 15:34:54 NA
3 2016-12-01 00:49:50 2016-12-01 01:19:10

我一直在努力解决这个问题。作为额外的复杂层,如果有一个参数控制时间窗口以允许匹配(即仅加入来自 df2 的行,如果它在 X 分钟内 df1 ),我会喜欢它,但是实际上,这是主要问题的次要问题。

最佳答案

第 1 部分 - 原始问题

您问题的第一部分可以用sqldf 包来回答。

library(sqldf)
df3 <- sqldf("SELECT * FROM df1 a
LEFT JOIN df2 b ON a.time < b.time
AND a.user = b.user")[,c(1:2, 4)]

#rename to match OP post
names(df3) <- c("user", "time_1", "time_2")

> df3
user time_1 time_2
1 1 2016-12-01 08:53:20 2016-12-01 11:50:11
2 1 2016-12-01 12:45:47 <NA>
3 2 2016-12-01 15:34:54 <NA>
4 3 2016-12-01 00:49:50 2016-12-01 01:19:10

第 2 部分 - 时间窗

如果您想要一个允许匹配的时间窗口,您可以在 SQL 语句中减去秒数,如下所示:

df3 <- sqldf("SELECT * FROM df1 a 
LEFT JOIN df2 b ON a.time < (b.time - 10000)
AND a.user = b.user")[,c(1:2, 4)]
> df3
user time time.1
1 1 2016-12-01 08:53:20 2016-12-01 11:50:11
2 1 2016-12-01 12:45:47 <NA>
3 2 2016-12-01 15:34:54 <NA>
4 3 2016-12-01 00:49:50 <NA>

请注意,无论您从 b.time 中选择什么,都将以 为单位。

关于r - 如何在时间列上组合基于 R 数据帧的约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41602763/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com