R로 데이터 통합 향상
게시 됨: 2022-03-11R 언어는 종종 통계학자와 데이터 과학자를 위한 언어로 인식됩니다. 아주 오래 전에 이것은 대부분 사실이었습니다. 그러나 수년에 걸쳐 패키지를 통해 R이 제공하는 유연성은 R을 보다 범용적인 언어로 만들었습니다. R은 1995년에 오픈 소스였으며 그 이후로 R 패키지의 저장소가 지속적으로 증가하고 있습니다. 그래도 Python과 같은 언어에 비해 R은 데이터를 기반으로 합니다.
데이터에 대해 말하면 테이블 형식 데이터는 가장 일반적으로 사용되는 데이터 유형 중 하나이기 때문에 특히 주의를 기울여야 합니다. 데이터베이스에서 알려진 테이블 구조에 해당하는 데이터 유형으로, 각 열은 다른 유형일 수 있으며 해당 특정 데이터 유형의 처리 성능은 많은 응용 프로그램에서 중요한 요소입니다.
이 기사에서는 효율적인 방식으로 테이블 형식 데이터 변환을 달성하는 방법을 제시할 것입니다. 이미 머신 러닝에 R을 사용하고 있는 많은 사람들은 R에서 데이터 정리를 더 빠르게 수행할 수 있고 이를 위해 다른 도구를 사용할 필요가 없다는 것을 인식하지 못합니다.
R의 고성능 솔루션
Base R은 1997년 이전에 S-PLUS를 기반으로 한 data.frame
클래스를 도입했습니다. 행 단위로 데이터를 저장하는 일반적으로 사용되는 데이터베이스와 달리 R data.frame
은 데이터를 메모리에 열 지향 구조로 저장하므로 분석에서 일반적인 열 작업에 대해 캐시 효율성이 높아집니다. 또한 R은 함수형 프로그래밍 언어이지만 개발자에게 적용하지 않습니다. 두 기회 모두 CRAN 저장소에서 사용할 수 있는 data.table
R 패키지로 잘 해결되었습니다. 작업을 그룹화할 때 매우 빠르게 수행되며 특정 작업에 필요한 열만 구체화하는 것과 같이 중간 데이터 하위 집합을 구체화하는 데 주의하여 특히 메모리 효율적입니다. 또한 열을 추가하거나 업데이트하는 동안 참조 의미 체계를 통해 불필요한 복사를 방지합니다. 패키지의 첫 번째 버전은 2006년 4월에 게시되어 당시 data.frame
성능이 크게 향상되었습니다. 초기 패키지 설명은 다음과 같습니다.
이 패키지는 거의 수행하지 않습니다. 존재하는 유일한 이유는 백서에 data.frame에 행 이름이 있어야 한다고 명시되어 있기 때문입니다. 이 패키지는 data.frame처럼 작동하지만 최대 10배 적은 메모리를 사용하고 최대 10배 더 빠르게 생성(및 복사)할 수 있는 새로운 클래스 data.table을 정의합니다. 또한 [] 내부의 표현식과 같은 하위 집합() 및 with()를 허용할 기회가 있습니다. 대부분의 코드는 row.names를 조작하는 코드가 제거된 기본 함수에서 복사됩니다.
그 이후로 data.frame
및 data.table
구현이 모두 개선되었지만 data.table
은 여전히 기본 R보다 엄청나게 빠릅니다. 실제로 data.table
은 기본 R보다 빠르지 않지만 하나인 것처럼 보입니다. Python Pandas와 같은 도구, 열 기반 스토리지 데이터베이스 또는 Spark와 같은 빅 데이터 앱과 경쟁하는 가장 빠른 오픈 소스 데이터 랭글링 도구입니다. 분산 공유 인프라에 대한 성능은 아직 벤치마킹되지 않았지만 단일 인스턴스에서 최대 20억 개의 행을 가질 수 있다는 점은 유망한 전망을 제공합니다. 뛰어난 성능은 기능과 함께합니다. 또한, 점진적인 성능 향상을 위해 시간이 많이 걸리는 부품을 병렬화하려는 최근의 노력으로 인해 성능 한계를 밀어붙이는 방향이 매우 명확해 보입니다.
데이터 변환 예
R 학습은 대화식으로 작동하기 때문에 조금 더 쉬워지므로 단계별로 예제를 따르고 언제든지 각 단계의 결과를 볼 수 있습니다. 시작하기 전에 CRAN 저장소에서 data.table
패키지를 설치합시다.
install.packages("data.table")
유용한 힌트 : ?install.packages
와 같이 앞에 물음표가 붙은 이름을 입력하기만 하면 모든 기능의 설명서를 열 수 있습니다.
R에 데이터 로드
종종 기본 드라이버를 포함하는 다양한 형식과 데이터베이스에서 데이터를 추출하기 위한 수많은 패키지가 있습니다. 원시 테이블 형식 데이터의 가장 일반적인 형식인 CSV 파일에서 데이터를 로드합니다. 다음 예제에 사용된 파일은 여기에서 찾을 수 있습니다. fread
기능이 고도로 최적화되어 있으므로 CSV
읽기 성능에 대해 신경 쓸 필요가 없습니다.
패키지의 함수를 사용하려면 library
호출로 로드해야 합니다.
library(data.table) DT <- fread("flights14.csv") print(DT)
## year month day dep_delay arr_delay carrier origin dest air_time ## 1: 2014 1 1 14 13 AA JFK LAX 359 ## 2: 2014 1 1 -3 13 AA JFK LAX 363 ## 3: 2014 1 1 2 9 AA JFK LAX 351 ## 4: 2014 1 1 -8 -26 AA LGA PBI 157 ## 5: 2014 1 1 2 1 AA JFK LAX 350 ## --- ## 253312: 2014 10 31 1 -30 UA LGA IAH 201 ## 253313: 2014 10 31 -5 -14 UA EWR IAH 189 ## 253314: 2014 10 31 -8 16 MQ LGA RDU 83 ## 253315: 2014 10 31 -4 15 MQ LGA DTW 75 ## 253316: 2014 10 31 -5 1 MQ LGA SDF 110 ## distance hour ## 1: 2475 9 ## 2: 2475 11 ## 3: 2475 19 ## 4: 1035 7 ## 5: 2475 13 ## --- ## 253312: 1416 14 ## 253313: 1400 8 ## 253314: 431 11 ## 253315: 502 11 ## 253316: 659 8
데이터가 long-to-wide 또는 wide-to-long( pivot 및 unpivot 이라고도 함) 형식에서 재구성되어야 하므로 추가 처리를 위해 잘 모델링되지 않은 경우 ?dcast
및 ?melt
함수를 살펴볼 수 있습니다. reshape2 패키지에서 알려져 있습니다. 그러나 data.table
은 data.table/data.frame 클래스에 대해 더 빠르고 메모리 효율적인 메서드를 구현합니다.
data.table
구문으로 쿼리
data.frame
에 익숙하다면
쿼리 data.table
은 쿼리 data.frame
과 매우 유사합니다. i
인수에서 필터링하는 동안 df[df$col > 1, ]
와 같이 $
기호로 열 이름에 액세스할 필요 없이 열 이름을 직접 사용할 수 있습니다. 다음 인수 j
를 제공할 때 data.table
범위에서 평가할 표현식을 제공합니다. 비표현식 j
인수를 전달하려면 with=FALSE
사용하십시오. data.frame
메서드에 없는 세 번째 인수는 그룹을 정의하여 j
의 표현식이 그룹으로 평가되도록 합니다.
# data.frame DF[DF$col1 > 1L, c("col2", "col3")] # data.table DT[col1 > 1L, .(col2, col3), ...] # by group using: `by = col4`
데이터베이스에 익숙하다면
많은 측면에서 쿼리 data.table
은 더 많은 사람들이 익숙할 수 있는 SQL 쿼리에 해당합니다. 아래 DT
는 data.table
객체를 나타내며 SQL의 FROM
절에 해당합니다.
DT[ i = where, j = select | update, by = group by] [ having, ... ] [ order by, ... ] [ ... ] ... [ ... ]
행 정렬 및 열 재정렬
데이터 정렬은 시계열의 중요한 변환이며 데이터 추출 및 표시를 위한 가져오기이기도 합니다. data.frame
과 같은 방식으로 i
인수에 행 순서의 정수 벡터를 제공하여 정렬을 수행할 수 있습니다. 쿼리 order(carrier, -dep_delay)
의 첫 번째 인수는 데이터를 carrier
필드에서 오름차순으로 선택하고 dep_delay
측정에서 내림차순으로 데이터를 선택합니다. 두 번째 인수 j
는 이전 섹션에서 설명한 대로 반환될 열(또는 표현식)과 해당 순서를 정의합니다.
ans <- DT[order(carrier, -dep_delay), .(carrier, origin, dest, dep_delay)] head(ans)
## carrier origin dest dep_delay ## 1: AA EWR DFW 1498 ## 2: AA JFK BOS 1241 ## 3: AA EWR DFW 1071 ## 4: AA EWR DFW 1056 ## 5: AA EWR DFW 1022 ## 6: AA EWR DFW 989
참조로 데이터를 재정렬하려면 특정 순서로 데이터를 쿼리하는 대신 set*
함수를 사용합니다.
setorder(DT, carrier, -dep_delay) leading.cols <- c("carrier","dep_delay") setcolorder(DT, c(leading.cols, setdiff(names(DT), leading.cols))) print(DT)
## carrier dep_delay year month day arr_delay origin dest air_time ## 1: AA 1498 2014 10 4 1494 EWR DFW 200 ## 2: AA 1241 2014 4 15 1223 JFK BOS 39 ## 3: AA 1071 2014 6 13 1064 EWR DFW 175 ## 4: AA 1056 2014 9 12 1115 EWR DFW 198 ## 5: AA 1022 2014 6 16 1073 EWR DFW 178 ## --- ## 253312: WN -12 2014 3 9 -21 LGA BNA 115 ## 253313: WN -13 2014 3 10 -18 EWR MDW 112 ## 253314: WN -13 2014 5 17 -30 LGA HOU 202 ## 253315: WN -13 2014 6 15 10 LGA MKE 101 ## 253316: WN -13 2014 8 19 -30 LGA CAK 63 ## distance hour ## 1: 1372 7 ## 2: 187 13 ## 3: 1372 10 ## 4: 1372 6 ## 5: 1372 7 ## --- ## 253312: 764 16 ## 253313: 711 20 ## 253314: 1428 17 ## 253315: 738 20 ## 253316: 397 16
대부분의 경우 원본 데이터세트와 정렬/정렬된 데이터세트가 모두 필요하지 않습니다. 기본적으로 R 언어는 다른 함수형 프로그래밍 언어와 마찬가지로 정렬된 데이터를 새 개체로 반환하므로 참조로 정렬하는 것보다 두 배의 메모리가 필요합니다.
하위 집합 쿼리
비행 출발지 "JFK"와 6에서 9까지의 월에 대한 하위 집합 데이터 세트를 생성해 보겠습니다. 두 번째 인수에서 결과를 나열된 열에 하위 집합으로 지정하고 계산된 변수 sum_delay
하나를 추가합니다.
ans <- DT[origin == "JFK" & month %in% 6:9, .(origin, month, arr_delay, dep_delay, sum_delay = arr_delay + dep_delay)] head(ans)
## origin month arr_delay dep_delay sum_delay ## 1: JFK 7 925 926 1851 ## 2: JFK 8 727 772 1499 ## 3: JFK 6 466 451 917 ## 4: JFK 7 414 450 864 ## 5: JFK 6 411 442 853 ## 6: JFK 6 333 343 676
기본적으로 단일 열 data.table
에서 데이터 세트를 부분 집합화하면 해당 열에 대한 인덱스가 자동으로 생성됩니다. 그러면 해당 열에 대한 추가 필터링 호출에 대한 실시간 응답이 표시됩니다.
데이터세트 업데이트
참조로 새 열을 추가하는 것은 :=
연산자를 사용하여 수행되며 변수를 데이터 세트에 제자리에 할당합니다. 이렇게 하면 데이터세트의 메모리 내 복사가 방지되므로 각각의 새 변수에 결과를 할당할 필요가 없습니다.
DT[, sum_delay := arr_delay + dep_delay] head(DT)
## carrier dep_delay year month day arr_delay origin dest air_time ## 1: AA 1498 2014 10 4 1494 EWR DFW 200 ## 2: AA 1241 2014 4 15 1223 JFK BOS 39 ## 3: AA 1071 2014 6 13 1064 EWR DFW 175 ## 4: AA 1056 2014 9 12 1115 EWR DFW 198 ## 5: AA 1022 2014 6 16 1073 EWR DFW 178 ## 6: AA 989 2014 6 11 991 EWR DFW 194 ## distance hour sum_delay ## 1: 1372 7 2992 ## 2: 187 13 2464 ## 3: 1372 10 2135 ## 4: 1372 6 2171 ## 5: 1372 7 2095 ## 6: 1372 11 1980
한 번에 더 많은 변수를 추가하려면 데이터 세트에서 쿼리할 때 .(sum_delay = arr_delay + dep_delay)
와 유사한 DT[,
:= (sum_delay = arr_delay + dep_delay)]
구문을 사용할 수 있습니다.
i
인수와 결합하기만 하면 특정 행만 제자리에 업데이트하여 참조로 하위 할당할 수 있습니다.
DT[origin=="JFK", distance := NA] head(DT)
## carrier dep_delay year month day arr_delay origin dest air_time ## 1: AA 1498 2014 10 4 1494 EWR DFW 200 ## 2: AA 1241 2014 4 15 1223 JFK BOS 39 ## 3: AA 1071 2014 6 13 1064 EWR DFW 175 ## 4: AA 1056 2014 9 12 1115 EWR DFW 198 ## 5: AA 1022 2014 6 16 1073 EWR DFW 178 ## 6: AA 989 2014 6 11 991 EWR DFW 194 ## distance hour sum_delay ## 1: 1372 7 2992 ## 2: NA 13 2464 ## 3: 1372 10 2135 ## 4: 1372 6 2171 ## 5: 1372 7 2095 ## 6: 1372 11 1980
데이터 집계
데이터를 집계하기 위해 대괄호에 대한 세 번째 인수 by
제공합니다. 그런 다음 j
에서 집계 함수 호출을 제공해야 데이터가 실제로 집계될 수 있습니다. j
인수에 사용된 .N
기호는 각 그룹의 모든 관측값 수에 해당합니다. 이전에 언급했듯이 집계는 행 및 선택 열의 하위 집합과 결합될 수 있습니다.
ans <- DT[, .(m_arr_delay = mean(arr_delay), m_dep_delay = mean(dep_delay), count = .N), .(carrier, month)] head(ans)
## carrier month m_arr_delay m_dep_delay count ## 1: AA 10 5.541959 7.591497 2705 ## 2: AA 4 1.903324 3.987008 2617 ## 3: AA 6 8.690067 11.476475 2678 ## 4: AA 9 -1.235160 3.307078 2628 ## 5: AA 8 4.027474 8.914054 2839 ## 6: AA 7 9.159886 11.665953 2802
종종 행의 값을 그룹에 대한 집계와 비교해야 할 수도 있습니다. SQL에서는 AVG(arr_delay) OVER (PARTITION BY carrier, month)
으로 파티션에 집계를 적용합니다.
ans <- DT[, .(arr_delay, carrierm_mean_arr = mean(arr_delay), dep_delay, carrierm_mean_dep = mean(dep_delay)), .(carrier, month)] head(ans)
## carrier month arr_delay carrierm_mean_arr dep_delay carrierm_mean_dep ## 1: AA 10 1494 5.541959 1498 7.591497 ## 2: AA 10 840 5.541959 848 7.591497 ## 3: AA 10 317 5.541959 338 7.591497 ## 4: AA 10 292 5.541959 331 7.591497 ## 5: AA 10 322 5.541959 304 7.591497 ## 6: AA 10 306 5.541959 299 7.591497
이러한 집계로 데이터를 쿼리하지 않고 대신 참조에 의해 업데이트되는 실제 테이블에 넣는 경우 :=
연산자를 사용하여 이를 수행할 수 있습니다. 이렇게 하면 데이터 세트의 메모리 내 복사가 방지되므로 결과를 새 변수에 할당할 필요가 없습니다.
DT[, `:=`(carrierm_mean_arr = mean(arr_delay), carrierm_mean_dep = mean(dep_delay)), .(carrier, month)] head(DT)
## carrier dep_delay year month day arr_delay origin dest air_time ## 1: AA 1498 2014 10 4 1494 EWR DFW 200 ## 2: AA 1241 2014 4 15 1223 JFK BOS 39 ## 3: AA 1071 2014 6 13 1064 EWR DFW 175 ## 4: AA 1056 2014 9 12 1115 EWR DFW 198 ## 5: AA 1022 2014 6 16 1073 EWR DFW 178 ## 6: AA 989 2014 6 11 991 EWR DFW 194 ## distance hour sum_delay carrierm_mean_arr carrierm_mean_dep ## 1: 1372 7 2992 5.541959 7.591497 ## 2: NA 13 2464 1.903324 3.987008 ## 3: 1372 10 2135 8.690067 11.476475 ## 4: 1372 6 2171 -1.235160 3.307078 ## 5: 1372 7 2095 8.690067 11.476475 ## 6: 1372 11 1980 8.690067 11.476475
데이터 세트 조인
데이터 세트의 Base R 조인 및 병합은 특수한 유형의 하위 집합 작업으로 간주됩니다. 첫 번째 대괄호 인수 i
에서 결합하려는 데이터 세트를 제공합니다. i
에 제공된 데이터 세트의 각 행에 대해 [
를 사용하는 데이터 세트의 행을 찾습니다. 일치하는 행만 유지하려면( inner join ) 추가 인수 nomatch = 0L
을 전달합니다. on
인수를 사용하여 두 데이터 세트를 결합하려는 열을 지정합니다.

# create reference subset carrierdest <- DT[, .(count=.N), .(carrier, dest) # count by carrier and dest ][1:10 # just 10 first groups ] # chaining `[...][...]` as subqueries print(carrierdest)
## carrier dest count ## 1: AA DFW 5877 ## 2: AA BOS 1173 ## 3: AA ORD 4798 ## 4: AA SEA 298 ## 5: AA EGE 85 ## 6: AA LAX 3449 ## 7: AA MIA 6058 ## 8: AA SFO 1312 ## 9: AA AUS 297 ## 10: AA DCA 172
# outer join ans <- carrierdest[DT, on = c("carrier","dest")] print(ans)
## carrier dest count dep_delay year month day arr_delay origin ## 1: AA DFW 5877 1498 2014 10 4 1494 EWR ## 2: AA BOS 1173 1241 2014 4 15 1223 JFK ## 3: AA DFW 5877 1071 2014 6 13 1064 EWR ## 4: AA DFW 5877 1056 2014 9 12 1115 EWR ## 5: AA DFW 5877 1022 2014 6 16 1073 EWR ## --- ## 253312: WN BNA NA -12 2014 3 9 -21 LGA ## 253313: WN MDW NA -13 2014 3 10 -18 EWR ## 253314: WN HOU NA -13 2014 5 17 -30 LGA ## 253315: WN MKE NA -13 2014 6 15 10 LGA ## 253316: WN CAK NA -13 2014 8 19 -30 LGA ## air_time distance hour sum_delay carrierm_mean_arr ## 1: 200 1372 7 2992 5.541959 ## 2: 39 NA 13 2464 1.903324 ## 3: 175 1372 10 2135 8.690067 ## 4: 198 1372 6 2171 -1.235160 ## 5: 178 1372 7 2095 8.690067 ## --- ## 253312: 115 764 16 -33 6.921642 ## 253313: 112 711 20 -31 6.921642 ## 253314: 202 1428 17 -43 22.875845 ## 253315: 101 738 20 -3 14.888889 ## 253316: 63 397 16 -43 7.219670 ## carrierm_mean_dep ## 1: 7.591497 ## 2: 3.987008 ## 3: 11.476475 ## 4: 3.307078 ## 5: 11.476475 ## --- ## 253312: 11.295709 ## 253313: 11.295709 ## 253314: 30.546453 ## 253315: 24.217560 ## 253316: 17.038047
# inner join ans <- DT[carrierdest, # for each row in carrierdest nomatch = 0L, # return only matching rows from both tables on = c("carrier","dest")] # joining on columns carrier and dest print(ans)
## carrier dep_delay year month day arr_delay origin dest air_time ## 1: AA 1498 2014 10 4 1494 EWR DFW 200 ## 2: AA 1071 2014 6 13 1064 EWR DFW 175 ## 3: AA 1056 2014 9 12 1115 EWR DFW 198 ## 4: AA 1022 2014 6 16 1073 EWR DFW 178 ## 5: AA 989 2014 6 11 991 EWR DFW 194 ## --- ## 23515: AA -8 2014 10 11 -13 JFK DCA 53 ## 23516: AA -9 2014 5 21 -12 JFK DCA 52 ## 23517: AA -9 2014 6 5 -6 JFK DCA 53 ## 23518: AA -9 2014 10 2 -21 JFK DCA 51 ## 23519: AA -11 2014 5 27 10 JFK DCA 55 ## distance hour sum_delay carrierm_mean_arr carrierm_mean_dep count ## 1: 1372 7 2992 5.541959 7.591497 5877 ## 2: 1372 10 2135 8.690067 11.476475 5877 ## 3: 1372 6 2171 -1.235160 3.307078 5877 ## 4: 1372 7 2095 8.690067 11.476475 5877 ## 5: 1372 11 1980 8.690067 11.476475 5877 ## --- ## 23515: NA 15 -21 5.541959 7.591497 172 ## 23516: NA 15 -21 4.150172 8.733665 172 ## 23517: NA 15 -15 8.690067 11.476475 172 ## 23518: NA 15 -30 5.541959 7.591497 172 ## 23519: NA 15 -1 4.150172 8.733665 172
기본 R 부분 집합에 대한 일관성 때문에 외부 조인은 기본적으로 RIGHT OUTER
입니다. LEFT OUTER
를 찾고 있다면 위의 예와 같이 테이블을 교체해야 합니다. 기본 R merge
data.frame
과 동일한 API를 사용하여 merge
data.table
메서드에서 정확한 동작을 쉽게 제어할 수도 있습니다.
데이터 세트에 대한 열을 단순히 조회하려는 경우 조인하는 동안 j
인수에 :=
연산자를 사용하여 효율적으로 수행할 수 있습니다. 데이터 세트 업데이트 섹션에 설명된 대로 참조로 하위 할당하는 것과 동일한 방식으로 이제 조인할 데이터 세트에서 참조로 열을 추가하기만 하면 됩니다. 이렇게 하면 데이터의 메모리 내 복사가 방지되므로 결과를 새 변수에 할당할 필요가 없습니다.
DT[carrierdest, # data.table to join with lkp.count := count, # lookup `count` column from `carrierdest` on = c("carrier","dest")] # join by columns head(DT)
## carrier dep_delay year month day arr_delay origin dest air_time ## 1: AA 1498 2014 10 4 1494 EWR DFW 200 ## 2: AA 1241 2014 4 15 1223 JFK BOS 39 ## 3: AA 1071 2014 6 13 1064 EWR DFW 175 ## 4: AA 1056 2014 9 12 1115 EWR DFW 198 ## 5: AA 1022 2014 6 16 1073 EWR DFW 178 ## 6: AA 989 2014 6 11 991 EWR DFW 194 ## distance hour sum_delay carrierm_mean_arr carrierm_mean_dep lkp.count ## 1: 1372 7 2992 5.541959 7.591497 5877 ## 2: NA 13 2464 1.903324 3.987008 1173 ## 3: 1372 10 2135 8.690067 11.476475 5877 ## 4: 1372 6 2171 -1.235160 3.307078 5877 ## 5: 1372 7 2095 8.690067 11.476475 5877 ## 6: 1372 11 1980 8.690067 11.476475 5877
조인 중 집계 의 경우 by = .EACHI
를 사용합니다. 중간 조인 결과를 구체화하지 않고 즉석에서 집계를 적용하여 메모리를 효율적으로 만드는 조인을 수행합니다.
롤링 조인 은 정렬된 데이터를 처리하기 위해 설계된 드문 기능입니다. 시간 데이터 및 일반적으로 시계열을 처리하는 데 완벽하게 맞습니다. 기본적으로 조인 조건의 일치 항목을 다음 일치 값으로 롤링합니다. 조인할 때 roll
인수를 제공하여 사용합니다.
빠른 겹침 조인 은 다양한 겹침 연산자( any
, inside , start
, end
) within
사용하여 기간 및 겹침 처리를 기반으로 데이터 집합을 조인합니다.
동일하지 않은 조건을 사용하여 데이터세트를 조인하는 비동등 조인 기능이 현재 개발 중입니다.
프로파일링 데이터
데이터 세트를 탐색할 때 데이터 품질을 더 잘 이해하기 위해 주제에 대한 기술 정보를 수집하고자 할 수 있습니다.
기술 통계
summary(DT)
## carrier dep_delay year month ## Length:253316 Min. :-112.00 Min. :2014 Min. : 1.000 ## Class :character 1st Qu.: -5.00 1st Qu.:2014 1st Qu.: 3.000 ## Mode :character Median : -1.00 Median :2014 Median : 6.000 ## Mean : 12.47 Mean :2014 Mean : 5.639 ## 3rd Qu.: 11.00 3rd Qu.:2014 3rd Qu.: 8.000 ## Max. :1498.00 Max. :2014 Max. :10.000 ## ## day arr_delay origin dest ## Min. : 1.00 Min. :-112.000 Length:253316 Length:253316 ## 1st Qu.: 8.00 1st Qu.: -15.000 Class :character Class :character ## Median :16.00 Median : -4.000 Mode :character Mode :character ## Mean :15.89 Mean : 8.147 ## 3rd Qu.:23.00 3rd Qu.: 15.000 ## Max. :31.00 Max. :1494.000 ## ## air_time distance hour sum_delay ## Min. : 20.0 Min. : 80.0 Min. : 0.00 Min. :-224.00 ## 1st Qu.: 86.0 1st Qu.: 529.0 1st Qu.: 9.00 1st Qu.: -19.00 ## Median :134.0 Median : 762.0 Median :13.00 Median : -5.00 ## Mean :156.7 Mean : 950.4 Mean :13.06 Mean : 20.61 ## 3rd Qu.:199.0 3rd Qu.:1096.0 3rd Qu.:17.00 3rd Qu.: 23.00 ## Max. :706.0 Max. :4963.0 Max. :24.00 Max. :2992.00 ## NA's :81483 ## carrierm_mean_arr carrierm_mean_dep lkp.count ## Min. :-22.403 Min. :-4.500 Min. : 85 ## 1st Qu.: 2.676 1st Qu.: 7.815 1st Qu.:3449 ## Median : 6.404 Median :11.354 Median :5877 ## Mean : 8.147 Mean :12.465 Mean :4654 ## 3rd Qu.: 11.554 3rd Qu.:17.564 3rd Qu.:6058 ## Max. : 86.182 Max. :52.864 Max. :6058 ## NA's :229797
카디널리티
uniqueN
함수를 사용하여 데이터의 고유성을 확인하고 모든 열에 적용할 수 있습니다. 아래 쿼리의 개체 .SD 는 .SD
의 하위 집합에 해당합니다.
DT[, lapply(.SD, uniqueN)]
## carrier dep_delay year month day arr_delay origin dest air_time ## 1: 14 570 1 10 31 616 3 109 509 ## distance hour sum_delay carrierm_mean_arr carrierm_mean_dep lkp.count ## 1: 152 25 1021 134 134 11
NA 비율
각 열에 대해 알 수 없는 값(R의 경우 NA
, SQL의 경우 NULL
)의 비율을 계산하기 위해 모든 열에 적용할 원하는 함수를 제공합니다.
DT[, lapply(.SD, function(x) sum(is.na(x))/.N)]
## carrier dep_delay year month day arr_delay origin dest air_time ## 1: 0 0 0 0 0 0 0 0 0 ## distance hour sum_delay carrierm_mean_arr carrierm_mean_dep lkp.count ## 1: 0.3216654 0 0 0 0 0.9071555
데이터 내보내기
data.table
패키지는 테이블 형식 데이터를 CSV
형식으로 빠르게 내보내는 기능도 제공합니다.
tmp.csv <- tempfile(fileext=".csv") fwrite(DT, tmp.csv) # preview exported data cat(system(paste("head -3",tmp.csv), intern=TRUE), sep="\n")
## carrier,dep_delay,year,month,day,arr_delay,origin,dest,air_time,distance,hour,sum_delay,carrierm_mean_arr,carrierm_mean_dep,lkp.count ## AA,1498,2014,10,4,1494,EWR,DFW,200,1372,7,2992,5.54195933456561,7.59149722735674,5877 ## AA,1241,2014,4,15,1223,JFK,BOS,39,,13,2464,1.90332441727168,3.98700802445548,1173
이 글을 쓰는 시점에서 fwrite
함수는 아직 CRAN 저장소에 게시되지 않았습니다. 그것을 사용하려면 data.table
개발 버전을 설치해야 합니다. 그렇지 않으면 기본 R write.csv
기능을 사용할 수 있지만 빠르지는 않을 것입니다.
자원
사용할 수 있는 리소스가 많이 있습니다. 각 기능에 사용할 수 있는 설명서 외에도 특정 주제에 초점을 맞춘 자습서인 패키지 비네트도 있습니다. 시작하기 페이지에서 찾을 수 있습니다. 또한 프레젠테이션 페이지에는 전 세계의 data.table
프레젠테이션에서 30개 이상의 자료(슬라이드, 비디오 등)가 나열됩니다. 또한 커뮤니티 지원은 최근 Stack Overflow data.table
태그에 대한 4000번째 질문에 도달했으며 여전히 높은 답변 비율(91.9%)을 유지하는 등 수년에 걸쳐 성장했습니다. 아래 플롯은 시간 경과에 따른 스택 오버플로에 대한 data.table
태그가 지정된 질문의 수를 나타냅니다.
요약
이 기사에서는 data.table
패키지를 사용하여 R에서 효율적인 테이블 형식 데이터 변환을 위해 선택한 예를 제공합니다. 성능에 대한 실제 수치는 재현 가능한 벤치마크를 찾아 조사할 수 있습니다. 저는 많은 수치와 재현 가능한 코드를 찾을 수 있는 Data.table을 사용하여 일반적인 R 문제를 효율적으로 해결이라는 R 언어에 대한 상위 50개 평가 StackOverflow 질문에 대한 data.table
솔루션에 대한 요약된 블로그 게시물을 게시했습니다. 패키지 data.table
은 그룹화 작업에 빠른 기수 순서 지정의 기본 구현을 사용하고 빠른 하위 집합/조인에 대한 이진 검색을 사용합니다. 이 기수 순서는 버전 3.3.0에서 기본 R에 통합되었습니다. 또한 이 알고리즘은 최근 H2O 머신 러닝 플랫폼에 구현되고 H2O 클러스터를 통해 병렬화되어 10B x 10B 행에서 효율적인 빅 조인을 가능하게 합니다.