【问题标题】:Retiming a data.table in long format以长格式重定时 data.table
【发布时间】:2020-11-27 06:41:45
【问题描述】:

在给定表 y 中的日期的情况下,我需要对下表 x 重新采样,但我想保留与表中每个 ID 不匹配的日期。用这个简单的例子更容易解释(我正在使用 data.table 和 lubridate 库):

x <- data.table(id = c("A","A","A","B","B"), date = dmy(c("01-01-2010","01-01-2012","01-01-2014","01-01-2010","01-01-2012")),
                v1 =1:5)
x
   id       date v1
1:  A 2010-01-01  1
2:  A 2012-01-01  2
3:  A 2014-01-01  3
4:  B 2010-01-01  4
5:  B 2012-01-01  5

y <- data.table(date = dmy(c("01-01-2010","01-01-2013")) )

y
         date
1: 2010-01-01
2: 2013-01-01

这是我需要的输出:

   id       date v1
1:  A 2010-01-01  1
2:  A 2013-01-01 NA
3:  B 2010-01-01  4
4:  B 2013-01-01 NA

我发现的一个解决方案,对于这个小例子来说很简单,就是创建一个包含如下 ID 的“长格式”版本的 b

y <- data.table(id = c("A","A","B","B"), date = dmy(c("01-01-2010","01-01-2013","01-01-2010","01-01-2013")) )

y
   id       date
1:  A 2010-01-01
2:  A 2013-01-01
3:  B 2010-01-01
4:  B 2013-01-01

然后设置两个键

setkey(x,id,date)
setkey(y,id,date)

然后最后做一个右连接

x[y]

这给了我在这个简单的小例子中想要的结果。然而,在我的真实案例中,我的表 x 有数百万行(这是一分钟频率的数据),而表 y(重采样日期)只有几百行。我想创建一个也有数百万行长的新 y 来做这个伎俩是不必要的过多的内存消耗。 作为替代方案,我认为我可以做一个 for 循环并根据每个循环的 ID 将数据表分成块,然后在原始 y 上进行正确的连接(但只设置一个键)。但是,我想避免循环。

谢谢!

【问题讨论】:

    标签: r date join data.table


    【解决方案1】:

    这是一个选项:

    x[CJ(id, date=y$date, unique=TRUE), on=.NATURAL]
    

    【讨论】:

    • 非常感谢!这似乎工作得很好。也许奇怪(?)当应用于我的数据集(6 个变量超过 1 亿行)时,它似乎并不比循环快多少,但至少它更优雅。
    猜你喜欢
    • 2021-09-18
    • 2021-02-08
    • 2021-02-13
    • 2017-02-13
    • 1970-01-01
    • 1970-01-01
    • 2020-04-23
    • 2015-08-04
    • 2017-01-01
    相关资源
    最近更新 更多