我希望按用户ID合并两个数据集。我的问题是我必须过滤掉发生在另一个之后的数据集。一个简单的例子是
# Dataset 1 (dts1)
User ID date Hour transactions
1 5 25/07/2016 02:32 4
2 6 24/07/2016 02:42 2
3 8 25/07/2016 02:52 3
4 9 24/07/2016 03:02 4
5 11 25/07/2016 03:12 1
6 13 26/07/2016 03:22 3
和
# Dataset 2 (dts2)
User ID date Hour Events
1 5 25/07/2016 02:31 8
2 5 26/07/2016 02:42 6
3 5 24/07/2016 07:52 9
4 14 24/07/2016 03:02 5
5 5 25/07/2016 09:12 10
6 4 26/07/2016 03:22 4
我希望只映射数据集1之前发生的数据集2。所以,理想情况下我的输出就像那样
#output
User ID Events Events transactions
1 5 8 9 4
答案 0 :(得分:1)
使用dplyr
和lubridate
# install.packages("dplyr")
# install.packages("lubridate")
library(dplyr)
library(lubridate)
# join the two data.frames by Used_ID
left_join(dts1, dts2, by="User_ID") %>%
# apply the filtering condition. dts1 must be after dts2
filter(dmy_hm(paste(date.x, Hour.x)) >
dmy_hm(paste(date.y, Hour.y))) %>%
# Collapse the Events by user and transaction
group_by(User_ID, transactions) %>% summarise(Events = toString(Events))
答案 1 :(得分:0)
根据数据dts1
和dts2
,假设date
和Hour
为字符:
> dts1
UserID date Hour transactions
1 5 25/07/2016 02:32 4
2 6 24/07/2016 02:42 2
3 8 25/07/2016 02:52 3
4 9 24/07/2016 03:02 4
5 11 25/07/2016 03:12 1
6 13 26/07/2016 03:22 3
> dts2
UserID date Hour Events
1 5 25/07/2016 02:31 8
2 5 26/07/2016 02:42 6
3 5 24/07/2016 07:52 9
4 14 24/07/2016 03:02 5
5 5 25/07/2016 09:12 10
6 4 26/07/2016 03:22 4
基本思想是使两个数据帧中的时间具有可比性。首先,我们将dts2
中的日期/小时转换为POSIX类:
dts2$time <- strptime(paste(dts2$date, dts2$Hour), format="%d/%m/%Y %H:%M")
然后我们使用apply
来遍历dts1
,找到dts2
中匹配UserID
的行,条件是时间早于数据集1中的时间:
dts1$Events <- apply(dts1[,c("UserID","date","Hour")], MAR=1, function(x) {
time1 <- strptime(paste(x[2], x[3]), format="%d/%m/%Y %H:%M")
rows <- which(dts2$UserID==as.numeric(x[1]) & dts2$time<time1)
if (length(rows)>0) {
dts2$Events[rows]
} else {
NA
}
})
结果:
> dts1
UserID date Hour transactions Events
1 5 25/07/2016 02:32 4 8, 9
2 6 24/07/2016 02:42 2 NA
3 8 25/07/2016 02:52 3 NA
4 9 24/07/2016 03:02 4 NA
5 11 25/07/2016 03:12 1 NA
6 13 26/07/2016 03:22 3 NA