개요
나는에 익숙 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
방법이 실제로 더 간결하거나 실질적으로 더 우수하다는 것입니다.
예
용법dplyr
eddi의 질문 에서 임의의 수의 행을 반환하는 그룹화 된 작업을 허용하지 않습니다 ( 참고 : 이것은 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 % 더 빠르며, 작은 버전에서는dplyr
40 % 더 빠릅니다 ( 댓글에서 의견이 또 하나 있습니다 ). - 매트의 주요 저자는
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)]