data.table (우수한 패키지 !!!)에서 일부 집계를 수행하고 있으며 .SD 변수가 많은 것들에 매우 유용하다는 것을 알았습니다. 그러나 그룹을 많이 사용하면 계산 속도가 크게 느려집니다. 다음 예를 참조하십시오 :R data.table .SD를 사용할 때 느린 집계
# A moderately big data.table
x = data.table(id=sample(1e4,1e5,replace=T),
code=factor(sample(2,1e5,replace=T)),
z=runif(1e5)
)
setkey(x,id,code)
system.time(x[,list(code2=nrow(.SD[code==2]), total=.N), by=id])
## user system elapsed
## 6.226 0.000 6.242
system.time(x[,list(code2=sum(code==2), total=.N), by=id])
## user system elapsed
## 0.497 0.000 0.498
system.time(x[,list(code2=.SD[code==2,.N], total=.N), by=id])
## user system elapsed
## 6.152 0.000 6.168
내가 잘못하고 있나? 개별 열을 선호하는 SD를 피해야합니까? 미리 감사드립니다. 빨리보다는 즉, ~ 200 배를 내 컴퓨터에
system.time({
x2 <- x[code==2, list(code2=.N), by=id]
xt <- x[, list(total=.N), by=id]
print(x2[xt])
})
7.42 초에 반대는 0.04 초에서 실행 : 다음 두 단계로 계산을 깨는 결과 데이터 프레임을 병합하여이 문제를 해결
고마워요! 나는 ".SD 객체가 내부적으로 효율적으로 인수를 함수에 전달하는 것보다 효율적으로 구현되었다"는 구절에 속아서 "제발하지 마세요. DT [, sum (.SD [," sales =, with = FALSE]), by = grp]로 표시됩니다. 이렇게하면 많은 코드가 빨라집니다! – vsalmendra
@vsalmendra 아, 그렇습니다. 과거에 커뮤니티 토론에 맡겨져있는 일종의 것입니다. 궁극적으로 우리는'j' 최적화를 개선하여 사용자가 이와 같은 것을 알 필요가 없도록하고자합니다. –
@vsalmendra 이제 다음 릴리스에서 FAQ 2.1을 개선했습니다. –