`%between%` (data.table) 给了我一个奇怪的结果

Posted

技术标签:

【中文标题】`%between%` (data.table) 给了我一个奇怪的结果【英文标题】:`%between%` (data.table) gives me a odd result 【发布时间】:2018-10-24 23:08:09 【问题描述】:

我想按特定日期范围对 data.table 进行子集化,我尝试了 between 和 inrange 函数。我认为 %between% 会给我结果。然而,中间产生一个奇数。 这是样本数据 - 按两个时期(2014-05-06 ~ 2014-05-14 和 2015-05-06 ~ 2015-05-14)对样本数据进行子集化。

# Create a sample dataset    
library(data.table)
set.seed(1)
DT <- data.table(Date = seq.Date(from = as.Date("2014-01-01"),
                                 to = as.Date("2015-12-31"),
                                 by = 1),
                 Value = sample(365 * 2))

# Define the lower and upper ranges for the subsetting periods
lower = c(as.Date("2014-05-06"), as.Date("2015-05-06"))
upper = c(as.Date("2014-05-14"), as.Date("2015-05-14"))

# Try between function
DT[Date %between% list(lower, upper)]
# Some odd result
         Date Value
1: 2014-05-07   309
2: 2014-05-09   138
3: 2014-05-11   698
4: 2014-05-13    22
5: 2015-05-07   558
6: 2015-05-09   417
7: 2015-05-11   109
8: 2015-05-13   691

# Then try inrange function
DT[Date %inrange% list(lower, upper)]
# The results look good
          Date Value
 1: 2014-05-06   275
 2: 2014-05-07   309
 3: 2014-05-08   126
 4: 2014-05-09   138
 5: 2014-05-10   359
 6: 2014-05-11   698
 7: 2014-05-12    47
 8: 2014-05-13    22
 9: 2014-05-14   384
10: 2015-05-06     6
11: 2015-05-07   558
12: 2015-05-08   266
13: 2015-05-09   417
14: 2015-05-10    95
15: 2015-05-11   109
16: 2015-05-12   367
17: 2015-05-13   691
18: 2015-05-14   349

inrange 函数生成我所追求的表格。通过阅读 data.table 手册,我仍然不太清楚函数之间的工作原理,特别是当在 DT 之外提供 lower 和 upper 作为向量时。谁能给我一些线索?谢谢。

【问题讨论】:

【参考方案1】:

?between 的详细信息部分下,

从 v1.9.8+ 开始,between 被矢量化。如果需要,lower 和upper 会被回收到length(x)

因此,在DT[Date %between% list(lower, upper)] 中,它更像

DT[Date %between% list(rep(lower, DT[,.N/length(lower)]), rep(upper, DT[,.N/length(upper)]))]

而您对inrange 的理解仍然正确,即

inrange 检查 x 中的每个值是否在 lower,upper 中提供的任何区间之间。

【讨论】:

非常感谢您,chinsoon12!我现在很清楚。当外部向量用于函数之间时,通过将向量中的元素(如果它们的长度

以上是关于`%between%` (data.table) 给了我一个奇怪的结果的主要内容,如果未能解决你的问题,请参考以下文章

R语言data.table导入数据实战:data.table数据列索引

R语言data.table导入数据实战:data.table的链式操作语法(chaining)

R语言data.table导入数据实战:data.table中编写函数并使用SD数据对象

为啥 `data.table::unique` 不起作用?

R语言data.table导入数据实战:data.table数据列名称的重命名(rename)

R语言data.table导入数据实战:data.table使用by函数进行数据分组(aggregate)