【发布时间】: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