在R中映射两个数据帧,条件是其中一个数据帧的时间早于另一个

时间:2016-08-03 02:48:16

标签: r

我希望按用户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

2 个答案:

答案 0 :(得分:1)

使用dplyrlubridate

的替代方法
# 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)

根据数据dts1dts2,假设dateHour为字符:

> 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