【问题标题】:How to join data.frames based on two columns如何基于两列连接 data.frames
【发布时间】:2013-12-16 03:20:20
【问题描述】:

我有两个如下所示的数据框:

d1 <- data.frame(h1 = c("foo","foo","bar","bar"), h2= c("a","b","c","d"), h3=c("x1","x2","x3","x4"))

哪些打印:

   h1 h2 h3
1 foo  a x1
2 foo  b x2
3 bar  c x3
4 bar  d x4

还有

 d2 <- data.frame(t1= c("a","b","c","d"), t2=c("x1","x2","x3","x4"),val=(rnorm(4)))

产生:

   t1 t2      val
1  a x1 -1.183606
2  b x2 -1.358457
3  c x3 -1.512671
4  d x4 -1.253105
# surely the val columns will differ since we use rnorm()

我想要做的是基于d1中的h2-h3和d2中的t1-t2列组合d1和d2, 导致

foo  a x1 -1.183606
foo  b x2 -1.358457
bar  c x3 -1.512671
bar  d x4 -1.253105

有什么办法呢?

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    合并与多个键一起使用,并且可以为每一侧使用不同的列名。对于by 规范,x 是第一个数据帧,y 是第二个:

    merge(d1, d2, by.x=c('h2', 'h3'), by.y=c('t1', 't2'))
    ##   h2 h3  h1         val
    ## 1  a x1 foo -0.04356036
    ## 2  b x2 foo  0.56975774
    ## 3  c x3 bar  0.03251157
    ## 4  d x4 bar -0.67823770
    

    【讨论】:

      【解决方案2】:

      我认为这应该可以解决问题 - 您从每个数据框的列对中创建一个键,然后在该键上合并:

      d1$key = paste(d1$h2, d1$h3)
      d2$key = paste(d2$t1, d2$t2)
      merged = merge(d1, d2)
      

      【讨论】:

        【解决方案3】:

        这是使用data tables 的另一种方法。

        连接对于数据表来说非常高效。即使使用这些微小的数据集,数据表连接的速度也大约是原来的两倍,尽管您不会注意到这一点。对于更大的数据集,差异是巨大的。

        # data frames with 200,000 rows, same structure as OP's example
        df1 <- data.frame(h1=rep(c("foo","foo","bar","bar"),each=50000),
                          h2=rep(letters[1:20],1e4),
                          h3=rep(1:1e4,each=20))
        df2 <- data.frame(t1=rep(letters[1:20],1e4),
                          t2=rep(1:1e4,each=20),
                          val=rnorm(2e5))
        # time the merge (~8.4 sec)
        system.time(df.result <-merge(df1, df2, by.x=c('h2', 'h3'), by.y=c('t1', 't2')))
        #  user  system elapsed 
        #  8.41    0.02    8.42 
        
        # convert to data tables and set keys
        library(data.table)
        dt1 <- data.table(df1, key="h2,h3")
        dt2 <- data.table(df2, key="t1,t2")
        # time the join (~0.2 sec)
        system.time(dt.result <- dt1[dt2])
        #  user  system elapsed 
        #  0.19    0.00    0.18 
        

        底线:数据表连接在大型数据集上的速度提高了 40 倍以上。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-08-12
          • 1970-01-01
          • 2022-01-14
          • 2015-12-20
          • 1970-01-01
          • 2014-07-25
          • 2018-07-15
          • 2019-05-30
          相关资源
          最近更新 更多