2013-01-12 5 views
2

data.tableasof (rolling 또는 LOCF으로 알려짐)을 구현합니다. 나는이 관련 질문을 발견했습니다보다 효율적인 롤링 조인은 앞으로 전달되지 않습니까?

Filling in missing (blanks) in a data table, per category - backwards and forwards

하지만 문제는 데이터의 NA가 있습니다. 제 경우에는 데이터를 불규칙하게 유지하고 roll=TRUE을 사용하여 여기에 참여하기 위해 조언을 따르고 있습니다. 마지막 관찰 대신에 내가하고 싶은 것은, 가능한 한 효율적으로 역으로 진행될 다음 관찰입니다.

이것은 내가 시도한 것이며 time:=-time을 먼저 사용해보십시오. 더 잘할 수 있을까요? 더 빨리 할 수 ​​있을까요?


library(rbenchmark) 
benchmark(llorJoin(A,B),B[A,roll=T],replications=10) 
      test replications elapsed relative user.self sys.self user.child sys.child 
1 llorJoin(A, B)   10 0.045  1  0.048  0   0   0 
2 B[A, roll = T]   10 0.009  1  0.008  0   0   0 

    b    time e d 
1: a 2013-01-12 09:01:01 1 1.0 
2: a 2013-01-12 09:01:02 2 1.9 
3: a 2013-01-12 09:01:04 NA 2.0 
4: a 2013-01-12 09:01:05 NA 1.8 
5: b 2013-01-12 09:01:02 NA 5.0 
6: c 2013-01-12 09:01:01 NA 4.1 
7: c 2013-01-12 09:01:01 NA 4.2 

그래서 comparaison로, asof 초기 데이터에 가입


library(data.table) 
A <- data.table(time=as.POSIXct(c("10:01:01","10:01:02","10:01:04","10:01:05","10:01:02","10:01:01","10:01:01"),format="%H:%M:%S"), 
       b=c("a","a","a","a","b","c","c"), 
       d=c(1,1.9,2,1.8,5,4.1,4.2)); 
B <- data.table(time=as.POSIXct(c("10:01:01","10:01:03","10:01:00","10:01:01"),format="%H:%M:%S"),b=c("a","a","c","d"), e=c(1L,2L,3L,4L)); 
setkey(A,b,time) 
setkey(B,b,time) 
llorJoin <- function(A,B){ 
    B <- copy(B); 
    keys <- key(A); 
    if(!identical(key(A), key(B)) | is.null(keys)){ 
     stop("llorJoin::ERROR; A and B should have the same non-empty keys"); 
    } 

    lastKey <- tail(keys,1L); 
    myStr <- parse(text=paste0(lastKey,":=-as.numeric(",lastKey,")")); 
    A <- A[,eval(myStr)]; setkeyv(A,keys); 
    B <- B[,eval(myStr)]; setkeyv(B,keys); 

    origin <- "1970-01-01 00:00.00 UTC"; 
    A <- B[A,roll=T]; 
    myStr2 <- parse(text=paste0(lastKey,":=as.POSIXct(-",lastKey,",origin=origin)")); 
    A <- A[,eval(myStr2)]; setkeyv(A,keys); 
    return(A); 
} 

빨리 5 배이다.

+1

무엇이 구체적입니까? 당신은 당신이'locf' 대신에 마지막 관찰을 뒤로하고 싶다고 말했지만 이미 구현되어 있습니다. 작동합니까? 너무 느린가요? 좀 더 관용적 인 것을 찾고 있습니까? 나는 어쨌든 도울 수없는'data.table' 패키지에 대해 아무것도 모릅니다. 그러나 현재의 형태로 여러분의 질문에 ** ** data.table을 사용하는 잠재적 인 응답자는 제가 혼란스럽게 생각하는 것처럼 보입니다. – SlowLearner

+0

문제는'B [A, roll = T]','A'와'B'를 정렬해야한다는 것입니다. 그런 다음'time : = - time'을 되 돌리는 것은 정렬을 깨뜨립니다. 나는 이후에''setkey (A, time : = time [.N : .1], by = "b"]')로 정렬을 수행하는'setkey' 정렬을 제거하려고 노력했다. 하지만, 더 길어 보인다 ... – statquant

+2

@statquant StackOverflow의 요점은 유용한 답변을 생성하는 명확한 질문을하므로 다른 사람들에게 도움이 될 수있다.나는 당신의 질문을 들여다 보았고 당신은 장황한 경향이 있습니다. 이것은 영어의 문제는 아니지만 정신적 조직의 문제입니다. [이 하나] (http://stackoverflow.com/questions/6585820/r-merge-data-frames-asof-join) 괜찮은 질문으로 끝나고 [이 하나] (http://stackoverflow.com/questions/14076065/data-table-inner-outer-join-with-in-join-column-of-type-double-bug) 버그를 발견했습니다. 유용한 물건이지만, 중요하다는 점을 명심하십시오! – SlowLearner

답변

4

roll 인수는 오래 전부터 nocb을 수행 할 수 있습니다. #615을 닫을 수 있도록이 대답을 업데이트하십시오.

더 이상 키를 설정할 필요가 없습니다. 대신 on= 인수 (v1.9.6 구현)를 사용하여 조인 할 열을 지정할 수 있습니다. 이 두 가지 기능을 사용하면 다음과 같이 작업을 완료 할 수 있습니다.

require(data.table) # v1.9.6+ 
A[B, on=c("b", "time"), roll=-Inf] 
#     time b e d 
# 1: 2015-10-11 10:01:01 a 1 1.0 
# 2: 2015-10-11 10:01:02 a 2 1.9 
# 3: 2015-10-11 10:01:04 a NA 2.0 
# 4: 2015-10-11 10:01:05 a NA 1.8 
# 5: 2015-10-11 10:01:02 b NA 5.0 
# 6: 2015-10-11 10:01:01 c NA 4.1 
# 7: 2015-10-11 10:01:01 c NA 4.2 

그래, 맞아.


data.table으로 변경하지 않고도 가장 빠른 방법에 매우 근접했습니다. 다음 기능 요청은 몇 시간 전에 제출되었습니다

FR#2300 Add backwards and firstback to roll=TRUE

내가 다시이 질문에이 링크를 추가했습니다. R-Forge에서 기능 요청 목록을 검색 할 수 있습니다. 이 경우 "롤", "앞으로"및 "뒤로"와 같은 단어는 모두 그것을 찾습니다. 버그 또는 기능 요청이 아직 제출되지 않았 음을 확인하기 위해 4 ~ 5 회 검색 시도가 필요할 수 있습니다.

가능한 한 가장 빠른 해결 방법을 제공하는 것보다 기능 요청 (내부적으로 몇 줄만 필요합니다)을 구현하는 것이 더 빠릅니다.

+0

Matthew에게 감사드립니다. 기능 요청의 우선 순위를 업그레이드하거나 그대로 두시겠습니까? roll = { "loc =" "locf", "nocb"}'(다음 관찰은 역방향으로 진행) – statquant

+0

'roll = -30' 어딘가에 아이디어가있었습니다 (다음 관찰은 30 일, 예상 일 수), roll = + 30 (locf는 30 일 이내에 제공됨). 따라서 현재 'TRUE'는'+ Inf'에 해당합니다. 'FALSE'를 '0'으로 설정합니다. '-Inf'는 nocb가 될 것입니다. 어떻게 생각하니? –

+0

나는 그것이 훌륭하다고 생각한다, 그것은 "창"합류의 부가적인 특징을 추가하고있다! – statquant

관련 문제