2017-01-29 1 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 인 것이 바람직하므로 태그 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_priceMax_range 내에 있으면 해당 SignalTrue이고 그렇지 않으면 False이됩니다.

EDIT 2

라이트 원하는 출력

 
    Ticker Signal 
1: 0001 False 

그래서 I는 신호가 True 또는 False하고 업데이트 여부를 체크 한 함수를 생성하고자하는 원하는 출력 data.table에.

고맙습니다.

+0

당신이 간격을 정의하는 방법은 요소의 문자열 수준으로 '간격'을 만듭니다. interval에 대한 '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]" 

그것을 2의 수치 값으로 강제 된 두 번째 인수로 findInterval에 전달되므로이 결과였다

> 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 등)에 대한 찾을 것인지 제대로 이해합니까? 그 문제가 있다면

당신은 dplyr 및 논리적 표현에서 기능을 GROUP_BY 사용할 수 있습니다

group_by(dt,Ticker) %>% 
    summarise(Signal=any(with(.,Price>max_price & Price<min_price))) 
관련 문제