【问题标题】:Join data.table on exact date or if not the case on the nearest less than date在确切日期加入 data.table,如果不是,则在最近的小于日期的情况下加入
【发布时间】:2012-07-05 09:33:02
【问题描述】:

我想加入两个data.tables,使用日期作为加入。

嗯,有时我没有完全匹配,在这种情况下,我想找到最近的更少日期。我的问题与这篇关于 SQL 的帖子非常相似: SQL Join on Nearest less than date

我知道data.table 语法类似于 SQL,但我无法编写此代码。正确的语法是什么?

一个简化的例子:

Dt1 
   date      x
1/26/2010 - 10  
1/25/2010 - 9  
1/24/2010 - 9   
1/22/2010 - 7    
1/19/2010 - 11

Dt2
   date
1/26/2010   
1/23/2010   
1/20/2010  

输出

   date     x
1/26/2010 - 10  
1/23/2010 - 7 
1/20/2010 - 11

提前谢谢你。

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    给你:

    library(data.table)
    

    创建数据:

    Dt1 <- read.table(text="
    date      x
    1/26/2010,  10  
    1/25/2010,  9  
    1/24/2010,  9   
    1/22/2010,  7    
    1/19/2010,  11", header=TRUE, stringsAsFactors=FALSE)
    
    Dt2 <- read.table(text="
    date
    1/26/2010   
    1/23/2010   
    1/20/2010", header=TRUE, stringsAsFactors=FALSE)
    

    转换为data.table,将字符串转换为日期,并设置data.table键:

    Dt1 <- data.table(Dt1)
    Dt2 <- data.table(Dt2)
    
    Dt1[, date:=as.Date(date, format=("%m/%d/%Y"))]
    Dt2[, date:=as.Date(date, format=("%m/%d/%Y"))]
    
    setkey(Dt1, date)
    setkey(Dt2, date)
    

    加入表格,使用roll=TRUE:

    Dt1[Dt2, roll=TRUE]
    
               date  x
    [1,] 2010-01-20 11
    [2,] 2010-01-23  7
    [3,] 2010-01-26 10
    

    【讨论】:

    • @mat 很高兴这个答案对您有所帮助。供将来参考:如果您在问题中提供可重现的代码,这将有很大帮助 - 这鼓励人们回答,因为这意味着我们不必像我在这里所做的那样从头开始重新创建您的问题。此外,如果您发布带有错误消息的代码,我们本可以解释为什么会出现该错误消息以及您应该如何修复它。
    • 感谢 Andrie 和 Matthew 的回答!我在阅读文档时看到了这个参数“roll”。我之前尝试过,但它不起作用,我有这个输出 Erreur dans [.data.table(pixel, Trep, roll = T) : Attempting roll join on factor column i.date。只有整数、双精度或字符列可以滚动连接。我遇到了日期格式的问题。现在我明白了我处理日期格式的问题。非常感谢更多时间。
    【解决方案2】:
    ?data.table                  # search for the `roll` argument
    example(data.table)          # search for the example using roll=TRUE
    vignette("datatable-intro")  # see section "3: Fast time series join" 
    vignette("datatable-faq")    # see FAQs 2.16 and 2.20
    

    这是data.table 的主要功能之一。由于行是有序的(与 SQL 不同),因此此操作简单且非常快速。 SQL 本质上是无序的,因此您需要自联接和“排序依据”来完成此任务。它可以在 SQL 中完成并且可以工作,但它可能很慢并且需要更多代码。由于 SQL 是行存储,甚至是内存中的 SQL,它的下限由从 RAM 到 L2 缓存的页面提取确定。 data.table 低于该下限,因为它是列存储。

    这两个小插曲也在homepage 上。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-18
      • 1970-01-01
      • 1970-01-01
      • 2019-08-16
      • 2022-01-23
      相关资源
      最近更新 更多