개요
나는에 익숙 data.table하지 않고 비교적 익숙하다 dplyr. 나는 SO에 나타난 몇 가지 dplyr비네팅 과 예제를 읽었 으며 지금까지 나의 결론은 다음과 같습니다.
data.table와dplyr속도 비교입니다,이 많은 (예> -10 만) 그룹, 그리고 몇 가지 다른 상황에서 (아래 벤치 마크를 참조) 경우를 제외하고dplyr더 접근하기 쉬운 구문이 있습니다dplyr잠재적 인 DB 상호 작용을 추상화 (또는 의지)- 약간의 기능 차이가 있습니다 (아래의 "예 / 사용"참조).
내 마음에 2. 나는 그것에 상당히 익숙하기 때문에 많은 무게를 견디지 data.table못하지만, 두 사용자 모두에게 새로운 사용자에게는 큰 요인이 될 것임을 이해합니다. 나는 이미 익숙한 누군가의 관점에서 질문 한 특정 질문과 관련이 없기 때문에 더 직관적 인 주장을 피하고 싶습니다 data.table. 또한 "보다 직관적 인"방법으로 빠른 분석으로 이어지는 방법에 대한 논의를 피하고 싶습니다 (확실히 사실이지만 여기서 가장 관심있는 것은 아닙니다).
질문
내가 알고 싶은 것은 :
- 패키지에 익숙한 사람들을 위해 하나 또는 다른 패키지로 코딩하기가 훨씬 쉬운 분석 작업이 있습니까?
- 한 패키지에서 다른 패키지로 실질적으로 (즉, 2 배 이상)보다 효율적으로 수행되는 분석 작업이 있습니까?
하나 개는 최근 SO 질문은 나 때문에 내가 생각하지 않았다 그 시점이 될 때까지까지, 좀 더 이것에 대해 생각하고 있어요 dplyr많이 나는 이미 할 수있는 것 이상 제공 할 것입니다 data.table. dplyr솔루션 은 다음과 같습니다 (Q 끝의 데이터).
dat %.%
group_by(name, job) %.%
filter(job != "Boss" | year == min(year)) %.%
mutate(cumu_job2 = cumsum(job2))
data.table솔루션 에서 해킹 시도보다 훨씬 낫습니다 . 즉, 좋은 data.table솔루션도 꽤 좋습니다 (Jean-Robert, Arun에게 감사하며 여기에서 엄격하게 가장 최적의 솔루션보다 단일 진술을 선호했습니다).
setDT(dat)[,
.SD[job != "Boss" | year == min(year)][, cumjob := cumsum(job2)],
by=list(id, job)
]
후자의 구문은 매우 난해한 것처럼 보일 수 있지만 익숙한 경우 실제로는 매우 간단합니다 data.table(즉, 좀 더 난해한 트릭을 사용하지 않음).
이상적으로 내가보고 싶은 것은 좋은 예 dplyr또는 data.table방법이 실제로 더 간결하거나 실질적으로 더 우수하다는 것입니다.
예
용법dplyreddi의 질문 에서 임의의 수의 행을 반환하는 그룹화 된 작업을 허용하지 않습니다 ( 참고 : 이것은 dplyr 0.5 에서 구현되는 것처럼 보이며 @beginneR은do@eddi의 질문에 대한 답변에 사용 가능한 잠재적 해결 방법을 보여줍니다 ).data.table지원 압연 조인 아니라 (감사 @dholstius)로 중복 조인data.table동일한 기본 R 구문을 사용하는 동안 이진 검색 을 사용하는 자동 색인 작성 을 통해 양식의 표현DT[col == value]또는 속도에DT[col %in% values]대해 내부적으로 최적화 합니다. 자세한 내용과 작은 벤치 마크는 여기 를 참조하십시오 .dplyr이벤트 기능 (예를 들어, 표준 평가 버전regroup,summarize_each_) 그의 프로그램 사용을 단순화 할 수 있습니다dplyr(주목 프로그램을 사용data.table, 좀 신중하게 생각을 확실히 가능 필요합니다, 대체 / 인용 등, 내 지식에 적어도)
- 필자는 자체 벤치 마크를 실행 하여 "스플릿 적용 조합"스타일 분석에서 두 패키지가 비교할 수있는 것을 발견했습니다. 단, 그룹 수가 매우 많을 때 (> 100K)
data.table상당히 빨라졌습니다. - @Arun은 joins 에 대한 몇 가지 벤치 마크를 실행 하여 그룹 수가 증가 할
data.table때보 다 확장 성이 더 우수함을 보여줍니다dplyr(패키지와 최신 버전의 R 모두에서 최근 개선 된 기능으로 업데이트 됨). 또한 고유 한 값 을 얻으려고 할 때의 벤치 마크 는data.table~ 6 배 빠릅니다. - (확인되지 않음)은
data.table더 큰 버전의 그룹 / 적용 / 정렬에서 75 % 더 빠르며, 작은 버전에서는dplyr40 % 더 빠릅니다 ( 댓글에서 의견이 또 하나 있습니다 ). - 매트의 주요 저자는
data.table, 한 조작을 그룹화 벤치마킹data.table,dplyr그리고 파이썬pandas최대 20 억 행 (RAM에서 ~ 100기가바이트)에 . - 80K 그룹 의 이전 벤치 마크 는
data.table~ 8 배 빠릅니다.
데이터
이것은 질문 섹션에서 보여준 첫 번째 예입니다.
dat <- structure(list(id = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L,
2L, 2L, 2L, 2L, 2L, 2L), name = c("Jane", "Jane", "Jane", "Jane",
"Jane", "Jane", "Jane", "Jane", "Bob", "Bob", "Bob", "Bob", "Bob",
"Bob", "Bob", "Bob"), year = c(1980L, 1981L, 1982L, 1983L, 1984L,
1985L, 1986L, 1987L, 1985L, 1986L, 1987L, 1988L, 1989L, 1990L,
1991L, 1992L), job = c("Manager", "Manager", "Manager", "Manager",
"Manager", "Manager", "Boss", "Boss", "Manager", "Manager", "Manager",
"Boss", "Boss", "Boss", "Boss", "Boss"), job2 = c(1L, 1L, 1L,
1L, 1L, 1L, 0L, 0L, 1L, 1L, 1L, 0L, 0L, 0L, 0L, 0L)), .Names = c("id",
"name", "year", "job", "job2"), class = "data.frame", row.names = c(NA,
-16L))
dplyr과 data.table팀 모두 벤치 마크 작업을하고 있으므로 어느 시점에 답이있을 것입니다. # 2 (구문) imO는 엄격하게 허위이지만, 그것은 분명히 의견 영역으로 모험을하기 때문에, 나는 또한 종결하기로 투표하고 있습니다.
(d)plyr는 0을 측정했습니다
dplyr와 plyr구문에 관해서 기본적으로 내가 그들의 구문을 싫어하는 주된 이유이며, 내가 너무 많은 방법 이름으로 추가 기능 ((1 개 이상 읽기를) 배울 필요가 있다는 것입니다 그 여전히 이해가 안 돼요), 그들이하는 일, 그들이 취한 주장 등을 기억하십시오. 그것은 항상 plyr-philosophy에서 저에게 큰 도움이되었습니다.
.SD. [
dplyr하나 를 읽는 것과 비슷한 해결책 은 다음과 같습니다.as.data.table(dat)[, .SD[job != "Boss" | year == min(year)][, cumjob := cumsum(job2)], by = list(name, job)]