이 두 패키지의 철학이 특정 측면에서 다르기 때문에 간단하고 간단한 대답은 없습니다. 따라서 일부 타협은 피할 수 없습니다. 다음은 해결 / 고려해야 할 몇 가지 우려 사항입니다.
i
(== filter()
및 slice()
dplyr) 관련 작업
DT
10 개의 열을 가정합니다 . 다음 data.table 표현식을 고려하십시오.
DT[a > 1, .N]
DT[a > 1, mean(b), by=.(c, d)]
(1)의 행수 제공 DT
여기서 열 a > 1
. (2)는 (1)과 동일한 표현식에 대해 mean(b)
그룹화를 반환합니다 .c,d
i
일반적으로 사용되는 dplyr
표현은 다음과 같습니다.
DT %>% filter(a > 1) %>% summarise(n())
DT %>% filter(a > 1) %>% group_by(c, d) %>% summarise(mean(b))
분명히 data.table 코드는 더 짧습니다. 또한 메모리 효율성이 더 높습니다 1 . 왜? (3)과 (4) 모두 10 개 열 모두에 대한 행을 먼저 filter()
반환 하기 때문에 (3) 에서는 행 수만 필요하고 (4) 에서는 연속 작업을 위해 열만 필요 합니다. 이것을 극복하기 위해, 우리는 apriori 열 이 필요합니다 :b, c, d
select()
DT %>% select(a) %>% filter(a > 1) %>% summarise(n())
DT %>% select(a,b,c,d) %>% filter(a > 1) %>% group_by(c,d) %>% summarise(mean(b))
두 패키지 간의 주요 철학적 차이점을 강조하는 것이 중요합니다.
에서 data.table
, 우리는 함께이 관련 작업을 계속, 그리고 그것은 볼 수 있습니다 j-expression
(같은 함수 호출에서) 및 (1)의 모든 열에 대한 필요가 없습니다 실현. 의 표현식 i
이 계산되고 .N
행 수를 제공하는 논리 벡터의 합계입니다. 전체 하위 집합은 결코 실현되지 않습니다. (2)에서는 b,c,d
열만 서브 세트에서 구체화되고 다른 열은 무시됩니다.
그러나에서 dplyr
철학은 기능이 정확히 한 가지 일을 잘하도록하는 것 입니다. (적어도 현재) 작업에 filter()
필터링 한 모든 열이 필요한지 여부를 알 수있는 방법이 없습니다 . 이러한 작업을 효율적으로 수행하려면 미리 생각해야합니다. 저는 개인적으로이 경우 반 감각적이라고 생각합니다.
(5)와 (6)에서는 여전히 a
필요하지 않은 열의 하위 집합을 제공 합니다. 그러나 나는 그것을 피하는 방법을 잘 모르겠습니다. 경우 filter()
함수가 반환하는 열을 선택하는 인수했다, 우리는이 문제를 방지 할 수 있지만 그 기능은 (또한 dplyr 디자인 선택 인) 한 작업을하지 않습니다.
참조로 하위 할당
dplyr은 참조로 업데이트 하지 않습니다 . 이것은 두 패키지 간의 또 다른 큰 (철학적) 차이점입니다.
예를 들어 data.table에서 다음을 수행 할 수 있습니다.
DT[a %in% some_vals, a := NA]
조건을 충족하는 행만 a
참조로 열을 업데이트 합니다. 현재 dplyr은 전체 data.table을 내부적으로 복사하여 새 열을 추가합니다. @BrodieG는 이미 그의 답변에서 이것을 언급했습니다.
그러나 FR # 617 이 구현 되면 깊은 복사를 얕은 복사로 대체 할 수 있습니다 . 관련 항목 : dplyr : FR # 614 . 그래도 수정 한 열은 항상 복사됩니다 (따라서 약간 느리거나 메모리 효율성이 떨어짐). 참조로 열을 업데이트하는 방법은 없습니다.
기타 기능
data.table에서 조인하는 동안 집계 할 수 있으며 중간 조인 결과가 결코 구체화되지 않으므로 이해하기가 더 쉽고 메모리 효율적입니다. 이 게시물 에서 예를 확인하십시오 . dplyr의 data.table / data.frame 구문을 사용하여 (현재는?) 그렇게 할 수 없습니다.
data.table의 롤링 조인 기능은 dplyr의 구문에서도 지원되지 않습니다.
우리는 최근에 data.table에 중첩 조인을 구현하여 간격 범위 ( 예제 ) 에 대해 조인했습니다.이 조인 은 현재 별도의 함수 foverlaps()
이므로 파이프 연산자 (magrittr / pipeR?-직접 시도한 적이 없음)와 함께 사용할 수 있습니다.
그러나 궁극적으로 우리의 목표는 [.data.table
위에서 설명한 것과 동일한 제한 사항이 적용되는 그룹화, 결합하는 동안 집계 등과 같은 다른 기능을 수집 할 수 있도록 통합 하는 것입니다.
1.9.4부터 data.table은 일반 R 구문에서 빠른 이진 검색 기반 하위 집합을 위해 보조 키를 사용하여 자동 인덱싱을 구현합니다. 예 : DT[x == 1]
그리고 DT[x %in% some_vals]
첫 번째 실행에서 자동으로 인덱스를 생성 한 다음 이진 검색을 사용하여 동일한 열의 연속 하위 집합에서 빠른 하위 집합에 사용됩니다. 이 기능은 계속 발전 할 것입니다. 이 기능에 대한 간략한 개요를 보려면 이 요점 을 확인하십시오 .
filter()
data.tables에 대해 구현 되는 방식 에서이 기능을 활용하지 않습니다.
dplyr 기능은 현재 data.table이 제공 하지 않는 동일한 구문을 사용하여 데이터베이스에 대한 인터페이스를 제공한다는 것 입니다.
따라서 이러한 (그리고 아마도 다른 요점)을 고려하여 이러한 트레이드 오프가 허용되는지 여부를 결정해야합니다.
HTH
(1) 대부분의 경우 병목 현상은 주 메모리에서 캐시로 데이터를 이동하고 가능한 한 캐시의 데이터를 사용하여 캐시 미스를 줄이는 것이므로 메모리 효율성은 속도에 직접적인 영향을 미칩니다 (특히 데이터가 커질수록). -주 메모리 액세스를 줄이기 위해). 여기서는 자세히 설명하지 않습니다.
dplyr
데이터 테이블에 대한 방법이 있지만, 데이터 테이블은 또한 자신의 비교 방법이있다