data.table
은 asof
(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 배이다.
무엇이 구체적입니까? 당신은 당신이'locf' 대신에 마지막 관찰을 뒤로하고 싶다고 말했지만 이미 구현되어 있습니다. 작동합니까? 너무 느린가요? 좀 더 관용적 인 것을 찾고 있습니까? 나는 어쨌든 도울 수없는'data.table' 패키지에 대해 아무것도 모릅니다. 그러나 현재의 형태로 여러분의 질문에 ** ** data.table을 사용하는 잠재적 인 응답자는 제가 혼란스럽게 생각하는 것처럼 보입니다. – SlowLearner
문제는'B [A, roll = T]','A'와'B'를 정렬해야한다는 것입니다. 그런 다음'time : = - time'을 되 돌리는 것은 정렬을 깨뜨립니다. 나는 이후에''setkey (A, time : = time [.N : .1], by = "b"]')로 정렬을 수행하는'setkey' 정렬을 제거하려고 노력했다. 하지만, 더 길어 보인다 ... – statquant
@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