나는 총 관측 수와 관측치 수를 임계치보다 많이 계산하려는 많은 그룹 (+ 2mil)을 가진 시뮬레이션 된 데이터 세트를 사용하고 있습니다. 2) 각 그룹마다.각 그룹 내에서 조건이 참인 횟수를 계산하십시오.
플래그 변수를 만들 때 훨씬 더 빠르게 나타납니다. 특히 dplyr
에 대해 더 빠르며 data.table
에 대해 조금 더 빠릅니다.
왜 이런 일이 발생합니까? 각각의 경우 백그라운드에서 어떻게 작동합니까?
아래 예제를 확인하십시오. 사용
모의 집합
# create an example dataset
set.seed(318)
N = 3000000 # number of rows
dt = data.frame(id = sample(1:5000000, N, replace = T),
value = runif(N, 0, 10))
library(dplyr)
# calculate summary variables for each group
t = proc.time()
dt2 = dt %>% group_by(id) %>% summarise(N = n(),
N2 = sum(value > 2))
proc.time() - t
# user system elapsed
# 51.70 0.06 52.11
# calculate summary variables for each group after creating a flag variable
t = proc.time()
dt2 = dt %>% mutate(flag = ifelse(value > 2, 1, 0)) %>%
group_by(id) %>% summarise(N = n(),
N2 = sum(flag))
proc.time() - t
# user system elapsed
# 3.40 0.16 3.55
을 사용 dplyr data.table
library(data.table)
# set as data table
dt2 = setDT(dt, key = "id")
# calculate summary variables for each group
t = proc.time()
dt3 = dt2[, .(N = .N,
N2 = sum(value > 2)), by = id]
proc.time() - t
# user system elapsed
# 1.93 0.00 1.94
# calculate summary variables for each group after creating a flag variable
t = proc.time()
dt3 = dt2[, flag := ifelse(value > 2, 1, 0)][, .(N = .N,
N2 = sum(flag)), by = id]
proc.time() - t
# user system elapsed
# 0.33 0.04 0.39
'data.table' 용'합 (VAR) '와'.N' 최적화 gforce이다. 그러나'sum (expr)'에 대해서는 아직 없습니다 ..'verbose = TRUE'를 추가하고 최적화 된 표현의 차이점을보십시오. 앞으로이 사례를 더 잘 포착하기 위해 노력할 것입니다. – Arun
참고 : 더 이상 그룹화/결합 작업을위한 키를 설정할 필요가 없습니다. 키를 원한다면 괜찮습니다.하지만 꼭 알 필요는 없습니다. – Arun
'data.table'에서 나는 data.table이 이미 두 번째 인스턴스에서 정렬되어 있다는 것을 의심합니다. 각 인스턴스 위에'dt2 = setDT (dt, key = "id")'를 넣으십시오. – lmo