data.table을 사용하여 데이터 집합에 걸쳐 그룹별로 두 개의 매개 변수 함수를 빠르게 적용 할 수 있습니까? 1 백만 행의 데이터 세트에서 아래 정의 된 간단한 함수를 호출하는 것이 11 초를 넘기 때문에이 복잡성에 대해 예상하는 것보다 훨씬 길다는 것을 알았습니다.R data.table에 대한 빠른 쿼리 -이 두 인수 함수를 그룹별로 더 빠르게 적용 할 수 있습니까?
# generate data frame - 1 million rows
library(data.table)
set.seed(42)
nn = 1e6
daf = data.frame(aa=sample(1:1000, nn, repl=TRUE),
bb=sample(1:1000, nn, repl=TRUE),
xx=rnorm(nn),
yy=rnorm(nn),
stringsAsFactors=FALSE)
# myfunc is the function to apply to each group
myfunc = function(xx, yy) {
if (max(yy)>1) {
return(mean(xx))
} else {
return(weighted.mean(yy, ifelse(xx>0, 2, 1)))
}
}
# running the function takes around 11.5 seconds
system.time({
dt = data.table(daf, key=c("aa","bb"))
dt = dt[,myfunc(xx, yy), by=c("aa","bb")]
})
head(dt)
# OUTPUT:
# aa bb V1
# 1: 1 2 -1.02605645
# 2: 1 3 -0.49318243
# 3: 1 4 0.02165797
# 4: 1 5 0.40811793
# 5: 1 6 -1.00312393
# 6: 1 7 0.14754417
크게 이런 함수 호출 시간을 줄일 수있는 방법이 있나요 :
자체 포함 된 코드는 아래에 내가 뭘하려고 오전의 본질을 설명?
함수 호출을 완전히 다시 작성하지 않고 위의 계산을 수행하는 더 효율적인 방법이 있는지 또는 함수를 분리하여 data.table에 다시 써서 만 쓸 수 있는지 여부에 관심이 있습니다. 통사론.
답장에 미리 감사드립니다.
당신은 좀 더 속도 향상을 데리러 갈게 (예를 들어'DT3 [= 1, w] [▼, XX> 0 : = 2] ') – eddi
그것은이다 'dt [, mean (a), by = b]'가'mymean = function (x) mean (x)보다 훨씬 빠르다는 것을 의미합니다. ; dt [, mymean (a), by = b]' – eddi