2017-01-29 2 views
0

Есть ли простой способ оценить диапазон и проверить, находится ли целое число в пределах этого диапазона?Проверьте, находится ли одно целое число в определенном диапазоне в data.table?

За исключением этого сообщения Check to see if a value is within a range in R? Я не нашёл других соответствующих.

Пример

range <- cut(rep(1,5),4) # Create intervals 
range.test <- range[2] 
# Now I want to check whether integer 1L is within the range.test (Of course it is) 
Code comes here. 

Я пытался использовать findInterval, а также преобразовать range.test в вектор, или использовать seq, inrange или другие функции, но не удалось.

Поскольку весь анализ основан на data.table, и эта часть анализа является частью всей практики, для которой выход предпочтительнее, чем одна таблица данных. Поэтому я поставил тег data.table, чтобы убедиться в его согласованности.

EDIT

Вся картина в контексте data.table.

dt <- data.table(structure(list(Time = c("2016-01-04 09:05:06", "2016-01-04 09:20:00","2016-01-04 09:30:00", "2016-01-04 09:30:01", "2016-01-04 09:30:02","2016-01-04 09:30:05", "2016-01-04 09:30:06", "2016-01-04 09:31:35","2016-01-04 09:31:38", "2016-01-04 09:32:33"), Price = c(105,104.1, 104.1, 103.9, 104.1, 104, 104.1, 104.1, 104.1, 104), Volume = c(9500L,23500L, 18500L, 12500L, 16118L, 13000L, 2500L, 300L, 500L, 500L), Flag = c(1L, 0L, 1L, 0L, 1L, 0L, 1L, 1L, 1L, 0L), Ticker = c("0001","0001", "0001", "0001", "0001", "0001", "0001", "0001", "0001","0001")), .Names = c("Time", "Price", "Volume", "Flag", "Ticker"), class = c("data.table", "data.frame"), row.names = c(NA, -10L))) 
 
        Time Price Volume Flag Ticker 
1: 2016-01-04 09:05:06 105.0 9500 1 0001 
2: 2016-01-04 09:20:00 104.1 23500 0 0001 
3: 2016-01-04 09:30:00 104.1 18500 1 0001 
4: 2016-01-04 09:30:01 103.9 12500 0 0001 
5: 2016-01-04 09:30:02 104.1 16118 1 0001 
6: 2016-01-04 09:30:05 104.0 13000 0 0001 
7: 2016-01-04 09:30:06 104.1 2500 1 0001 
8: 2016-01-04 09:30:07 104.1 1500 1 0001 
9: 2016-01-04 09:30:08 104.3 500 1 0001 
10: 2016-01-04 09:30:10 104.0 1000 0 0001 
11: 2016-01-04 09:30:11 103.9 1000 0 0001 
12: 2016-01-04 09:30:15 104.0 3500 1 0001 
13: 2016-01-04 09:30:17 104.3 2000 1 0001 
14: 2016-01-04 09:30:19 104.3 1500 1 0001 
15: 2016-01-04 09:30:20 104.4 500 1 0001 
16: 2016-01-04 09:30:21 104.4 1500 1 0001 
17: 2016-01-04 09:30:22 104.4 1000 1 0001 
18: 2016-01-04 09:30:24 104.4 1500 1 0001 
19: 2016-01-04 09:30:25 104.0 2000 0 0001 
20: 2016-01-04 09:30:27 104.1 3500 1 0001 
21: 2016-01-04 09:30:35 104.0 500 0 0001 
22: 2016-01-04 09:31:14 104.1 5000 1 0001 
23: 2016-01-04 09:31:15 104.1 500 1 0001 
24: 2016-01-04 09:31:18 104.1 2500 1 0001 
25: 2016-01-04 09:31:25 104.1 3000 1 0001 
26: 2016-01-04 09:31:29 104.0 2000 0 0001 
27: 2016-01-04 09:31:30 104.1 500 1 0001 
28: 2016-01-04 09:31:35 104.1 300 1 0001 
29: 2016-01-04 09:31:38 104.1 500 1 0001 
30: 2016-01-04 09:32:33 104.0 500 0 0001 

# First get the distribution of the Volume 
    distribution <- dt[Flag == 1, sum(Volume), by = cut(Price, 5)][, percentage := list(V1/sum(V1))] 
# Get the max range bin 
Max_range <- distribution[which.max(percentage), cut] 
# Get the Closing price 
Closing_price <- dt[.N, Price] 
# Check whether the closing price is in the Max_range 
Code comes here[?????] 

Так вот возникает вопрос: для конкретного Ticker, как проверить, является ли цена закрытия в пределах определенного диапазона? Требуется только True или False. Если closing_price находится в пределах Max_range, то соответствующий Signal будет True, в противном случае это будет False.

EDIT 2

Добавлен желаемый результат

Нужный выход

 
    Ticker Signal 
1: 0001 False 

Так что я хотел бы создать одну функцию, чтобы проверить, является ли сигнал True или False, а затем обновить в таблице данных.

Большое спасибо!

+0

Как вы определяете интервалы просто создает «интервалы» как строки, уровни фактора. Вход в 'findInterval' для интервала является неубывающим вектором чисел. – Naumz

+0

Если вы хотите получить ответ «data.table», вы должны отправить код, который создает полезный тестовый пример. –

+0

привет, @Naumz, я отредактировал оригинал сообщения, чтобы сделать его понятным. Не могли бы вы дать какие-либо подсказки? Благодаря! – Bigchao

ответ

0

Объект range.test является переменным фактором с levels(range.test):

levels(range.test) 
[1] "(0.999,0.9995]" "(0.9995,1]"  "(1,1.0005]"  "(1.0005,1.001]" 

Когда вы передали его findInterval в качестве второго аргумента он принуждается к числовому значению 2, так что это был результат:

> findInterval(1,2) 
[1] 0 

Это было то, что должно было случиться, потому что 1 меньше 2. Если вам действительно нужна последовательность числовых значений от 0.999 до 1.001 с 5 значениями, вы должны использовать seq:

> seq(0.999, 1.001, length=5) 
[1] 0.9990 0.9995 1.0000 1.0005 1.0010 

Затем вы можете проверить, в каком интервале этого вектора номер 1.000 будет лежать:

> findInterval(1, seq(0.999, 1.001, length=5)) 
[1] 3 
+0

Спасибо большое @ 42-, я сделал обновление к оригинальному сообщению, чтобы было ясно. Не могли бы вы предоставить какие-либо инструкции? Большое спасибо! – Bigchao

1

Так что я правильно понимаю, что вы хотите, чтобы найти для каждого тикер (001,002 и т.д.), если есть значение, которое выходит за пределы заданного диапазона?

Если это вопрос, вы можете использовать функцию group_by из dplyr и логического выражения:

group_by(dt,Ticker) %>% 
    summarise(Signal=any(with(.,Price>max_price & Price<min_price))) 
Смежные вопросы