2017-09-07 3 views
0

수동으로하지 않고 출시 날짜와 다음 버전 릴리스 날짜 사이의 날짜 범위를 기준으로 어떤 제품 버전이 유효했는지 나타내는 더미 변수를 만들고 싶습니다. 해당 출시 날짜와 다음 버전이 출시 된 몇 백 가지 버전이 있으며이 데이터를 Purchases 데이터 프레임과 병합/결합합니다.R 날짜순으로 더미 변수 만들기

현재 I는 다음과 같이 두 개의 데이터 프레임 (버전 및 구입)가 :

View(Version) 
Type Version Release_Date Next_Release 
A  1.2.3 2013-11-14  2014-01-11 
B  1.3.1 2014-01-11  2014-02-20 
A  1.5.1 2014-02-20  2014-03-08 
A  1.5.2 2014-03-08  2014-04-06 
B  1.5.3 2014-04-06  2014-04-12 
A  1.5.4 2014-04-12  2014-04-15 
B  1.5.5 2014-05-15  2014-05-20 
B  1.6.1 2014-05-20  2014-06-26 
A  1.6.2 2014-06-26  2014-07-14 

View(Purchases) 
TIMESTAMP Amount 
2013-11-14 15.44 
2013-11-14 13.39 
2013-11-14 15.35 
2013-11-15 86.43 
2014-01-15 12.30 
2014-01-17 23.55 

내가 날짜 범위에 따라 '구매'데이터 프레임의 각 버전에 대한 더미 변수를 생성하고자하는 버전이 적용되었습니다. 즉 구매의 타임 스탬프는 해당 버전이 해당 버전 더미 = 어떤 조언이나 도움에 미리 1 개, 그렇지 않으면 0

View(Purchases) 
TIMESTAMP Amount Version_1.2.3 Version_1.3.1 .... 
2013-11-14 15.44  1    0 
2013-11-14 13.39  1    0 
2013-11-14 15.35  1    0 
2013-11-15 86.43  1    0 
2014-01-15 12.30  0    1 
2014-01-17 23.55  0    1 
.... 

감사합니다 당신이 효과가 있다는 날짜 범위 내에있는 경우.

+0

표시기 열을 하나씩 계산 해 본 적이 있습니까? – kitman0804

답변

1

작업은 두 개의 하위 작업으로 나눌 수 있습니다

  1. 는 다양한 형식으로 긴에서, 구입의 TIMESTAMP 전에
  2. 모양 변경을 Release_Date 가장 최근의를 찾을 수 있습니다. 가장 최근의 자료를 찾기위한

data.table 패키지는 롤링

TIMESTAMP Amount Version 
1: 2013-11-14 15.44 1.2.3 
2: 2013-11-14 13.39 1.2.3 
3: 2013-11-14 15.35 1.2.3 
4: 2013-11-15 86.43 1.2.3 
5: 2014-01-15 12.30 1.3.1 
6: 2014-01-17 23.55 1.3.1 

library(data.table) 
setDT(Version) 
setDT(Purchases) 

Version[Purchases, on = .(Release_Date = TIMESTAMP), roll = TRUE, 
     .(TIMESTAMP = i.TIMESTAMP, Amount, Version)] 
또는 비 동등이 조인

두 가지 가능성을 제공합니다

Version[Purchases, on = .(Release_Date <= TIMESTAMP), mult = "last", 
     .(TIMESTAMP = i.TIMESTAMP, Amount, Version)] 

동일한 결과를 산출합니다.

# non-equi join 
Version[Purchases, on = .(Release_Date <= TIMESTAMP), mult = "last", 
     .(TIMESTAMP = i.TIMESTAMP, Amount, Version)][ 
    , dcast(.SD, TIMESTAMP + Amount ~ paste0("Version_", Version), length)] 
재편 동안 경우 열이 변경되어야한다

# rolling join 
Version[Purchases, on = .(Release_Date = TIMESTAMP), roll = TRUE, 
     .(TIMESTAMP = i.TIMESTAMP, Amount, Version)][ 
    , dcast(.SD, TIMESTAMP + Amount ~ Version, length)] 
TIMESTAMP Amount 1.2.3 1.3.1 
1: 2013-11-14 13.39  1  0 
2: 2013-11-14 15.35  1  0 
3: 2013-11-14 15.44  1  0 
4: 2013-11-15 86.43  1  0 
5: 2014-01-15 12.30  0  1 
6: 2014-01-17 23.55  0  1 

또는 :

는 고쳐 들어 dcast() 함수 집계 length() 함께 사용

TIMESTAMP Amount Version_1.2.3 Version_1.3.1 
1: 2013-11-14 13.39    1    0 
2: 2013-11-14 15.35    1    0 
3: 2013-11-14 15.44    1    0 
4: 2013-11-15 86.43    1    0 
5: 2014-01-15 12.30    0    1 
6: 2014-01-17 23.55    0    1