如何匹配R中约束两个数据框?

By simon at 2018-02-28 • 0人收藏 • 52人看过

我有两种数据集。 一个是人们在电梯上的数据,另一个是数据 电梯抵达了第一层。 这是使用电梯的人的数据

usercode    board time(sec) 
1           165 
2           167 
3           170 
4           340 
5           351 
6           820 
7           830 
8           1200    
9           1201    
10          1400    
这是电梯进度表的数据
elevator code   arrival time
1               164
2               338
3               813
4               1175
5               1367
我想要的是
usercode    board time(sec) elevator code     elevator arrival time
1           165                 1                   164
2           167                 1                   164
3           170                 1                   164
4           340                 2                   338
5           351                 2                   338
6           820                 3                   813
7           830                 3                   813
8           1200                4                   1175
9           1201                4                   1175
10          1400                5                   1367
帮我!!请

3 个回复 | 最后更新于 2018-02-28
2018-02-28   #1

第一个数据为dat1,第二个数据为dat2我们 可以做 :

  transform(dat1,add=dat2[rowSums(outer(dat1[,2],dat2[,2],">")),],row.names=NULL)

   usercode arrival_time.sec. add.elevator_code add.arrival_time
1         1               165                 1              164
2         2               167                 1              164
3         3               170                 1              164
4         4               340                 2              338
5         5               351                 2              338
6         6               820                 3              813
7         7               830                 3              813
8         8              1200                 4             1175
9         9              1201                 4             1175
10       10              1400                 5             1367

2018-02-28   #2

第一个数据为dat1,第二个数据为dat2我们 可以做 :

  transform(dat1,add=dat2[rowSums(outer(dat1[,2],dat2[,2],">")),],row.names=NULL)

   usercode arrival_time.sec. add.elevator_code add.arrival_time
1         1               165                 1              164
2         2               167                 1              164
3         3               170                 1              164
4         4               340                 2              338
5         5               351                 2              338
6         6               820                 3              813
7         7               830                 3              813
8         8              1200                 4             1175
9         9              1201                 4             1175
10       10              1400                 5             1367

2018-02-28   #3

您可能需要考虑如下使用data.table中的滚动连接:

arrival[people, on="arrivaltime_sec", roll=Inf]

#     elevatorcode arrivaltime arrivaltime_sec usercode
#  1:            1         164             165        1
#  2:            1         164             167        2
#  3:            1         164             170        3
#  4:            2         338             340        4
#  5:            2         338             351        5
#  6:            3         813             820        6
#  7:            3         813             830        7
#  8:            4        1175            1200        8
#  9:            4        1175            1201        9
# 10:            5        1367            1400       10
数据:
library(data.table)

people <- fread("usercode,arrivaltime_sec
1,165
2,167
3,170
4,340
5,351
6,820
7,830
8,1200
9,1201
10,1400")

arrival <- fread("elevatorcode,arrivaltime
1,164
2,338
3,813
4,1175
5,1367")

arrival[, arrivaltime_sec := arrivaltime]

登录后方可回帖

Loading...