我有两个数据集,我想用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和名称),并在必要时更改日期和价格列.有关在大型数据集上执行此操作的有效方法的任何想法?
你问过有效的方法,所以我将介绍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包作者将其引用为使数据整洁.