【问题标题】:Joining two data.tables in R based on multiple keys and duplicate entries基于多个键和重复条目在 R 中连接两个 data.tables
【发布时间】:2015-05-18 21:31:18
【问题描述】:

我正在尝试加入 R 基础中的两个 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

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

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

【问题讨论】:

  • 你说的“没用”是什么意思?
  • 我猜你想要DT1[DT2, Tavg := i.Tavg, allow = TRUE]。有关详细信息,请参阅this post
  • (To: Arun) 虽然 DT1 中的某些条目是重复的,但连接的结果几乎是(DT1 的)原始重复条目的 30 倍或更多倍,并且不匹配 Tavg...跨度>
  • 虽然有点小问题:
  • 结果低于 ID state Month Day Year Tavg 1 IL 2013 年 2 月 1 日 7 1 IL 2013 年 2 月 2 日 13 1 IL 2013 年 2 月 2 日 13 2 IL 2013 年 2 月 1 日 6

标签: r join data.table


【解决方案1】:

刚刚帮朋友解决了这个问题(他找不到一个好的 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)

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

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)

【讨论】:

    猜你喜欢
    • 2014-07-25
    • 2020-09-24
    • 2021-11-29
    • 2014-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-18
    相关资源
    最近更新 更多