连接2个数据集并创建匹配的新行

All*_*ids 6 r dplyr

我有两个数据集,我想用R加入 -

数据集1

    ID Name Date Price
    1    A   2011 $100
    2    B   2012 $200
    3    C   2013 $300
Run Code Online (Sandbox Code Playgroud)

数据集2

    ID Date Price
    1  2012 $100
    1  2013 $200
    3  2014 $300
Run Code Online (Sandbox Code Playgroud)

left-join()dplyrID中使用我最终会得到这个

    ID Name Date.x Price.x Date.y Price.y
    1   A   2011    $100   2012   $100
    1   A   2011    $100   2013   $200
    2   B   2012    $200
    3   C   2013    $300   2014   $300
Run Code Online (Sandbox Code Playgroud)

然而,作为最终产品我想拥有的是这个

    ID Name Date Price
    1  A     2011 $100
    1  A     2012 $100
    1  A     2013 $200
    2  B     2012 $200
    3  C     2013 $300
    3  C     2014 $300
Run Code Online (Sandbox Code Playgroud)

即,不是合并到现有行,我想在找到匹配时创建一个新行,并复制不会更改的现有信息(ID和名称),并在必要时更改日期和价格列.有关在大型数据集上执行此操作的有效方法的任何想法?

Fra*_*ank 6

你问过有效的方法,所以我将介绍data.table:

library(data.table)
setDT(DF1)
setDT(DF2)

# structure your data so ID attributes are only in an ID table
idDT = DF1[, .(ID, Name)]
DF1[, Name := NULL]

# stack data
DT = rbind(DF1, DF2)

# grab ID attributes if you really need them
DT[idDT, on="ID", Name := i.Name]
Run Code Online (Sandbox Code Playgroud)

这使

   ID Date Price Name
1:  1 2011  $100    A
2:  2 2012  $200    B
3:  3 2013  $300    C
4:  1 2012  $100    A
5:  1 2013  $200    A
6:  3 2014  $300    C
Run Code Online (Sandbox Code Playgroud)

rbind对于data.tables非常快.不过,当我只绑定两个表时,我真的不希望效率成为一个大问题.

关于旋转ID属性Name,它与dplyr包作者的推荐相匹配,dplyr包作者将其引用为使数据整洁.