`%ween%` (data.table) дает мне странный результат - PullRequest
0 голосов
/ 25 октября 2018

Я хотел бы поместить в таблицу data.table конкретный диапазон дат, и я попытался использовать как функции, так и функции inrange.Я предполагаю, что% между% даст мне результаты.Тем не менее, между производит странный.Вот примерные данные - поднабор выборочных данных на два периода (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 в качестве векторов.Кто-нибудь может дать мне некоторую подсказку?Спасибо.

1 Ответ

0 голосов
/ 25 октября 2018

В разделе Details в ?between,

Начиная с v1.9.8 +, between векторизовано.нижнее и верхнее возвращаются к 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 между любыми интервалами, предоставленными в нижнем, верхнем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...