基于多个键和重复条目在R中连接两个data.tables

Gab*_*iel 3 join r data.table

我试图在R base中加入两个data.tables,多个setkeys,并且重复输入.举个例子

>DT1
ID  state Month Day Year
1   IL    Jan   3   2013 
1   IL    Jan   3   2014
1   IL    Jan   3   2014
1   IL    Jan   10  2014
1   IL    Jan   11  2013
1   IL    Jan   30  2013
1   IL    Jan   30  2013
1   IL    Feb   2   2013
1   IL    Feb   2   2014
1   IL    Feb   3   2013
1   IL    Feb   3   2014

>DT2
state Month   Day   Year  Tavg
  IL    Jan    1    2013    13
  IL    Jan    2    2013    19
  IL    Jan    3    2013    22
  IL    Jan    4    2013    23
  IL    Jan    5    2013    26
  IL    Jan    6    2013    24
  IL    Jan    7    2013    27
  IL    Jan    8    2013    32
  IL    Jan    9    2013    36
  ...   ...    ..   ...      ... 
  ...   ...    ..   ...      ... 
  IL    Dec 31  2013    33
Run Code Online (Sandbox Code Playgroud)

我想将DT2的"Tavg"值添加到DT1中的相应日期.例如,DT1中2013年1月3日的所有条目都需要在附加列中包含Tavg 13.

我尝试了以下 setkey(DT1, state, Month, Day, Year)相同的DT2,然后是一个Join操作, DT1[DT2, nomatch=0, allow.cartesian=TRUE 但它没有用

D. *_*ods 7

刚刚帮助了一个朋友(他找不到一个好的Stack Overflow答案)所以我认为这个问题需要一个更完整的"玩具"答案.

这是一些带有一个不匹配密钥的简单数据表:

dt1 <- data.table(a = LETTERS[1:5],b=letters[1:5],c=1:5)
dt2 <- data.table(c = LETTERS[c(1:4,6)],b=letters[1:5],a=6:10)
Run Code Online (Sandbox Code Playgroud)

这里有几个多键合并选项:

merge(dt1,dt2,by.x=c("a","b"),by.y=c("c","b")) #Inner Join
merge(dt1,dt2,by.x=c("a","b"),by.y=c("c","b"),all=T) #Outer Join

setkey(dt1,a,b)
setkey(dt2,c,b)

dt2[dt1] #Left Join (if dt1 is the "left" table)
dt1[dt2] #Right Join (if dt1 is the "left" table)
Run Code Online (Sandbox Code Playgroud)