数据匹配R中的所有情况

时间:2017-07-09 02:12:19

标签: r matching

我有以下两个数据集( data1 data2 ),并且希望在所有可能情况下基于匹配变量进行匹配。

data1 <- data.frame(

match = c(rep("a",7),rep("b",7),rep("c",3),rep("d",2))

)

data2 <- data.frame(

match = c(rep("a",4),rep("b",5),rep("c",2),rep("d",9)),
unit1 = 
c(300,200,300,600,250,100,90,50,10,9,9.5,80,90,50,20,30,40,70,15,190)

)

为了创建以下格式的单个数据集: 另外值得注意的是,这些数据集很大,因此需要一种有效的方法来进行这种匹配。

  match unit1_1 unit1_2 unit1_3 unit1_4 unit1_5 unit1_6 unit1_7 unit1_8 unit1_9
    a   300 200 300 600                 
    a   300 200 300 600                 
    a   300 200 300 600                 
    a   300 200 300 600                 
    a   300 200 300 600                 
    a   300 200 300 600                 
    a   300 200 300 600                 
    b   250 100 90  50  10              
    b   250 100 90  50  10              
    b   250 100 90  50  10              
    b   250 100 90  50  10              
    b   250 100 90  50  10              
    b   250 100 90  50  10              
    b   250 100 90  50  10              
    c   9   9.5                         
    c   9   9.5                         
    c   9   9.5                         
    d   80  90  50  20  30  40  70  15  190
    d   80  90  50  20  30  40  70  15  190

1 个答案:

答案 0 :(得分:1)

您可以通过几种方式执行此操作,此处使用data.table函数:

library( data.table )
setDT( data2 )
setDT( data1 )

添加一列以帮助转换为宽格式,并按照您希望的方式设置列名称。

data2[ , record := paste0( "unit1_", seq_len( .N ) ), by = match ]

从长格式转换为宽格式。

data3 <- dcast( data2, match ~ record, value.var = "unit1", fill = NA_real_ )    

现在使用match列将其与您的初始data1集合

合并
data4 <- merge( data1, data3, by = "match", all = TRUE )

data4

#    match unit1_1 unit1_2 unit1_3 unit1_4 unit1_5 unit1_6 unit1_7 unit1_8 unit1_9
# 1:     a     300   200.0     300     600      NA      NA      NA      NA      NA
# 2:     a     300   200.0     300     600      NA      NA      NA      NA      NA
# 3:     a     300   200.0     300     600      NA      NA      NA      NA      NA
# 4:     a     300   200.0     300     600      NA      NA      NA      NA      NA
# 5:     a     300   200.0     300     600      NA      NA      NA      NA      NA
# 6:     a     300   200.0     300     600      NA      NA      NA      NA      NA
# 7:     a     300   200.0     300     600      NA      NA      NA      NA      NA
# 8:     b     250   100.0      90      50      10      NA      NA      NA      NA
# 9:     b     250   100.0      90      50      10      NA      NA      NA      NA
# 10:     b     250   100.0      90      50      10      NA      NA      NA      NA
# 11:     b     250   100.0      90      50      10      NA      NA      NA      NA
# 12:     b     250   100.0      90      50      10      NA      NA      NA      NA
# 13:     b     250   100.0      90      50      10      NA      NA      NA      NA
# 14:     b     250   100.0      90      50      10      NA      NA      NA      NA
# 15:     c       9     9.5      NA      NA      NA      NA      NA      NA      NA
# 16:     c       9     9.5      NA      NA      NA      NA      NA      NA      NA
# 17:     c       9     9.5      NA      NA      NA      NA      NA      NA      NA
# 18:     d      80    90.0      50      20      30      40      70      15     190
# 19:     d      80    90.0      50      20      30      40      70      15     190