table in r




data.table 대 dplyr:다른 사람이 잘 할 수 없거나 잘못 수행 할 수 있습니까? (2)

질문 제목에 직접 응답 ...

dplyrdata.table 할 수없는 일을 분명히 합니다.

당신의 요점 # 3

dplyr은 잠재적 인 DB 상호 작용을 추상화합니다.

자신의 질문에 대한 직접적인 대답이지만 충분히 높은 수준으로 올라가지는 않습니다. dplyr 은 진정으로 확장 가능한 프론트 엔드로서 여러 개의 데이터 저장 메커니즘을 제공합니다. 여기서 data.table 은 단일 테이블의 확장입니다.

목표와 핸들러를 마음대로 확장 할 수있는 동일한 문법을 ​​사용하는 모든 대상과 함께 백 엔드 무신론자 인터페이스로 dplyr 을 살펴보십시오. data.tabledplyr 관점에서 해당 대상 중 하나입니다.

data.table 쿼리를 번역하여 디스크 또는 네트워크 데이터 저장소에서 작동하는 SQL 문을 만들려고하는 날을 결코 보지 못할 것입니다.

dplyrdata.table 이 수행하지 않을 작업을 수행 할 수도 있습니다.

메모리 내 작업의 설계를 기반으로 data.tabledplyr 보다 쿼리를 병렬 처리로 확장하는 데 훨씬 어려울 수 있습니다.

체내 질문에 대한 응답으로 ...

용법

패키지 에 익숙한 사람들을 위해 하나 또는 다른 패키지로 코딩하는 것이 훨씬 쉬운 분석 작업이 있습니까 (예 : 필요한 키 입력 조합 대 필수 요구 사항의 수준, 각 항목이 적음).

이것은 펀트처럼 보일지 모르지만 진짜 대답은 아니오입니다. 도구에 익숙한 사람들 은 자신에게 가장 친숙한 도구 또는 실제로 작업중인 도구에 적합한 도구를 사용하는 것처럼 보입니다. 그런 말로는 때때로 특정 가독성, 때로는 수준의 성능을 제시하기를 원하며, 둘 다 충분히 높은 수준을 필요로 할 때는 이미 명확한 추상화를 수행하는 데 필요한 다른 도구가 필요할 수 있습니다 .

공연

한 패키지에서 다른 패키지보다 더 효율적으로 (즉, 2 배 이상) 수행되는 분석 작업이 있습니까?

다시, 아니. data.table모든 일에 효율적인 것으로 탁월 어디에 않는 dplyr기본 데이터 저장소 및 등록 된 처리기에 대한 몇 가지 측면에서 제한되는 부담을 가져옵니다.

당신이 성능 문제로 실행하면 이는 data.table당신이 당신의 쿼리 기능이며이 경우 꽤 확신 할 수 있습니다 에 실제로 병목 data.table다음 자신에게 보고서를 제출의 기쁨을 수상했습니다. 백엔드로 dplyr사용할 때도 마찬가지 입니다 data.table. 당신 은 약간의 오버 헤드를 볼 있지만 확률은 쿼리입니다.dplyr

dplyr성능 문제가 당신이 실행 이전에 생성 된 쿼리를 조작 (데이터베이스의 경우) 하이브리드 평가 나에 대한 함수를 등록하여 주위 얻을 수 등을-끝납니다.

또한 plyr이 data.table보다 좋은지에 대한 대답을 볼 수 있을까요?

개요

나는 상대적으로 data.table 가 아닌 data.table 잘 알고있다. 나는 몇 가지 dplyr 비 네트 및 예제를 통해 읽었으며, 지금까지 내 결론은 다음과 같습니다.

  1. data.tabledplyr 는 많은 그룹 (즉,> 10-100K)이있는 경우를 제외하고는 속도면에서 비슷합니다. 그리고 다른 상황에서는 (아래의 벤치 마크를 참조하십시오)
  2. dplyr 에 더 쉽게 액세스 할 수있는 구문이 있습니다.
  3. dplyr 은 잠재적 인 DB 상호 작용을 추상화합니다.
  4. 사소한 기능 차이점이 있습니다 (아래 "예제 / 사용법"참조)

내 마음 속에서 나는 data.table 대해 잘 알고 있기 때문에 많은 무게를 부담하지 않는다. 두 사용자 모두에게 새로운 것이 큰 요인이된다는 것을 이해하고 있지만. 나는 data.table 이미 익숙한 누군가의 관점에서 묻는 나의 특정 질문과 관련이 data.table 보다 직관적 인 것에 대한 논쟁은 피하고 data.table . "더 직관적 인"방법이 더 빠른 분석으로 이어지는 방법에 대한 토론도 피하고 싶습니다. (물론 사실이지만 여기에서 내가 가장 관심이있는 것은 아닙니다.)

의문

내가 알고 싶은 것은 :

  1. 패키지에 익숙한 사람들을 위해 하나 또는 다른 패키지로 코딩하는 것이 훨씬 쉬운 분석 작업이 있습니까 (예 : 필요한 키 입력 조합 대 필수 요구 사항의 수준, 각 항목이 적음).
  2. 한 패키지에서 다른 패키지보다 더 효율적으로 (즉, 2 배 이상) 수행되는 분석 작업이 있습니까?

최근의 한 가지 질문 은이 점에 대해 좀 더 생각해 dplyr 그 시점까지는 dplyr 이 이미 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 방식이 훨씬 간결하거나 실질적으로 더 우수한 성능을 data.table 것을 좋은 예제로보고 싶습니다.

예제들

용법
  • dplyr 는 임의의 수의 행을 반환하는 그룹화 된 연산을 허용하지 않습니다 ( eddi의 질문 에서 메모 : 이것은 dplyr 0.5 에서 구현되는 것처럼 보입니다. @beginneR은 @ eddi의 질문에 대한 답에서 do 를 사용하여 잠재적 인 해결 방법을 보여줍니다) .
  • data.table롤링 조인 (감사 @dholstius)과 오버랩 조인을 지원합니다.
  • data.table 은 동일한 기본 R 구문을 사용하는 동안 이진 검색 을 사용하는 자동 인덱싱 을 통해 속도 를 위해 DT[col == value] 또는 DT[col %in% values] 형식의 표현식을 내부적으로 최적화합니다. 좀 더 자세한 내용과 작은 벤치 마크를 보려면 여기참조하십시오 .
  • dplyrdplyr 의 프로그래밍 방식의 사용을 단순화 할 수있는 함수 (예 : dplyr , summarize_each_ )의 표준 평가판을 제공합니다 ( dplyr 의 프로그래밍 방식 사용은 확실히 가능합니다. 적어도 지식에 대한 신중한 생각, 대입 / 인용 등이 필요함). )
벤치 마크

데이터

이것은 질문 섹션에서 보여준 첫 번째 예제입니다.

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))

다음은 Arun의 대답에 대한 광범위한 개요에 따라 dplyr 관점에서 포괄적 인 대답을 시도한 것입니다 (그러나 우선 순위에 따라 다소 재배치 됨).

통사론

구문에 주관성이 있지만, data.table의 간결함은 배우기가 어렵고 읽기가 더 어렵다는 내 성명서에 근거합니다. 이것은 dplyr가 훨씬 쉬운 문제를 해결하고 있기 때문에 부분적으로 발생합니다!

dplyr이 당신에게하는 한 가지 중요한 사실은 옵션을 제한 한다는 것입니다. 필자는 대부분의 단일 테이블 문제는 "그룹 별"부사와 함께 필터, 선택, 변형, 정렬 및 요약하는 5 개의 핵심 동사로 해결할 수 있다고 주장합니다. 이 제약 조건은 데이터 조작을 학습 할 때 큰 도움이됩니다. 문제에 대한 생각을 정리하는 데 도움이되기 때문입니다. dplyr에서이 동사는 각각 하나의 함수로 매핑됩니다. 각 기능은 하나의 작업을 수행하며 별도로 이해하기 쉽습니다.

이러한 간단한 작업을 %>% 와 함께 파이프함으로써 복잡성을 만듭니다. 다음은 Arun 과 연결된 게시물 중 하나의 예입니다.

diamonds %>%
  filter(cut != "Fair") %>%
  group_by(cut) %>%
  summarize(
    AvgPrice = mean(price),
    MedianPrice = as.numeric(median(price)),
    Count = n()
  ) %>%
  arrange(desc(Count))

이전에 dplyr을 본 적이 없더라도 (또는 R!) 함수가 모두 영어 동사이기 때문에 계속 발생하는 요지를 얻을 수 있습니다. 영어 동사의 단점은 [ 보다 더 많은 타이핑이 필요하다는 것입니다.하지만 더 나은 자동 완성으로 크게 줄일 수 있다고 생각합니다.

다음은 동등한 data.table 코드입니다.

diamondsDT <- data.table(diamonds)
diamondsDT[
  cut != "Fair", 
  .(AvgPrice = mean(price),
    MedianPrice = as.numeric(median(price)),
    Count = .N
  ), 
  by = cut
][ 
  order(-Count) 
]

이미 data.table에 익숙하지 않은 이상이 코드를 따르는 것이 더 어렵습니다. (나는 또한 내 눈에 좋게 보이는 방식으로 반복되는 것을 들여 쓰기하는 방법을 알 수 없었다. 개인적으로, 내가 6 개월 전에 쓴 코드를 보았을 때, 낯선 사람이 쓴 코드를 보는 것과 같았 기 때문에, 장황한 코드라면 직접적으로 선호했다.

필자가 생각하기에 약간 가독성을 떨어 뜨리는 다른 두 가지 작은 요인이 있습니다.

  • 거의 모든 데이터 테이블 작업에서는 [ 상황을 파악하기 위해 추가 컨텍스트가 필요합니다. 예를 들어 x[y] 가 두 개의 데이터 테이블을 조인하거나 데이터 프레임에서 열을 추출합니까? 이것은 잘 쓰여진 코드에서 변수 이름이 무슨 일이 일어나야하는지 제안해야하기 때문에 작은 문제 일뿐입니다.

  • 나는 group_by() 가 dplyr에서 분리 된 연산 인 것을 좋아한다. 그것은 근본적으로 계산을 변경하므로 코드를 [.data.table 할 때 분명해야한다고 생각합니다. by 인수보다 group_by() 를 찾아내는 것이 더 쉽습니다.

나는 파이프 가 단지 하나의 패키지로 제한되지 않는다는 것도 좋아한다. 깔끔하게 정리하여 데이터를 정리하고 tidyr 에서 줄거리를 완성 할 수 있습니다. 또한 필자가 작성한 패키지에만 국한되지 않고 누구나 데이터 조작 파이프의 매끄러운 부분을 형성하는 함수를 작성할 수 있습니다. 실제로 나는 %>% 재 작성된 이전 데이터 테이블 코드를 선호합니다.

diamonds %>% 
  data.table() %>% 
  .[cut != "Fair", 
    .(AvgPrice = mean(price),
      MedianPrice = as.numeric(median(price)),
      Count = .N
    ), 
    by = cut
  ] %>% 
  .[order(-Count)]

%>% 로 파이핑하는 아이디어는 데이터 프레임에만 국한되지 않고 대화식 웹 그래픽 , 웹 스크래핑 , gists , 런타임 계약 등 다른 컨텍스트로 쉽게 일반화됩니다 ...)

메모리 및 성능

나는이 모든 것을 하나로 묶었습니다. 왜냐하면 나에게 중요하지 않기 때문입니다. 대부분의 R 사용자는 1 백만 행 이하의 데이터로 작업하며 dplyr는 처리 시간을 알지 못하는 크기의 데이터에 대해 충분히 빠릅니다. 중간 데이터에서 표현력을 위해 dplyr를 최적화합니다. 더 큰 데이터에서 원시 속도를 위해 data.table을 자유롭게 사용할 수 있습니다.

dplyr의 유연성은 동일한 구문을 사용하여 성능 특성을 쉽게 조정할 수 있음을 의미합니다. 데이터 프레임 백엔드가있는 dplyr의 성능이 충분하지 않은 경우 data.table 백엔드를 사용할 수 있습니다 (다소 제한적인 기능 세트가 있음에도 불구하고). 작업중인 데이터가 메모리에 들어 가지 않으면 데이터베이스 백엔드를 사용할 수 있습니다.

모든 말, dplyr 성능은 장기간에 나아질 것입니다. 기수 순서와 같은 data.table의 훌륭한 아이디어를 구현하고 조인 및 필터에 대해 동일한 색인을 사용합니다. 또한 다중 코어를 활용할 수 있도록 병렬화 작업을하고 있습니다.

풍모

2015 년에 몇 가지 작업을 계획하고 있습니다.

  • readr 패키지는 fread() 와 비슷한 디스크 및 메모리에서 파일을 쉽게 가져올 수 있도록합니다.

  • 비등시 조인에 대한 지원을 포함하여보다 융통성있는 조인.

  • 부트 스트랩 샘플, 롤업 등과 같은보다 유연한 그룹화

또한 R의 데이터베이스 커넥터 를 개선하고 웹 API 와 대화하며 html 페이지를 손쉽게 다듬을 수있는 시간을 투자하고 있습니다.





dplyr