[R data.table] Key 값의 매칭되는 모든 행(mult="all"), 첫번째 행(mult="first"), 마지막 행(mult="last"), 값이 존재하는 행만(nomatch = NULL) 가져오기
R 분석과 프로그래밍/R 데이터 전처리 2020. 10. 18. 22:01지난번 포스팅에서는 R data.table에서 Key를 칼럼 j 와 그룹 by와 함께 사용하는 방법을 소개하였습니다.
이번 포스팅에서는 R data.table에서 Key가 설정된 칼럼에 대해서 mult, nomatch 매개변수를 사용하여 조건이 매칭되는 행을 가져오는 다양한 방법을 소개하겠습니다.
(1) Key 값이 매칭되는 모든 행 가져오기: mult = "all"
(2) Key 값이 매칭되는 첫번째 행 가져오기: mult = "first"
(3) Key 값이 매칭되는 마지막 행 가져오기: mult = "last"
(4) Key 값이 매칭되는 마지막 행의 값이 존재하는 행만 가져오기: mult = "last", nomatch = NULL
(1) Key 값이 매칭되는 모든 행 가져오기: mult = "all" |
먼저 data.table 패키지를 불러오고, MASS 패키지의 Cars93에서 칼럼 몇개만 선택해서 예제로 사용할 간단한 data.table 자료를 만들어보겠습니다.
library(data.table) library(MASS) DT <- data.table(Cars93[, c("Model", "Type", "Price", "DriveTrain")]) > str(DT) Classes 'data.table' and 'data.frame': 93 obs. of 4 variables: $ Model : Factor w/ 93 levels "100","190E","240",..: 55 9 22 30 52 83 90 11 7 14 ... $ Type : Factor w/ 6 levels "Compact","Large",..: 1 1 1 1 1 1 1 1 1 1 ... $ Price : num 19.5 29.1 13.4 11.4 15.8 13.3 11.3 17.5 16.5 15.7 ... $ DriveTrain: Factor w/ 3 levels "4WD","Front",..: 1 2 2 2 2 2 2 2 2 2 ... - attr(*, ".internal.selfref")=<externalptr> - attr(*, "sorted")= chr [1:2] "Type" "DriveTrain"
|
다음으로, setkey() 함수를 사용하여 DT data.table에 차종(Type)과 동력전달장치(DriveTrain) 칼럼을 키로 설정(set the Key)해 보겠습니다.
> # Set the key with Type and DriveTrain columns > setkey(DT, Type, DriveTrain) > key(DT) [1] "Type" "DriveTrain"
|
이제 준비가 되었으니 mult = "all" 매개변수를 사용해서 키 값과 매칭하는 모든 행을 가져와보겠습니다.
키로 설정된 차종과 동력전달치에서 (a) 차종이 "Compact", "Van", "Sporty" 이고 (Type == c("Compact", "Van", "Sporty")) & (b) 동력전달장치가 후륜 (DriveTrain == "Rear") 인 차를 모두 (mult = "all") 가져오시오.
모두 9개의 행을 반환했는데요, 이중에서 3번, 4번 행을 보면, 차종이 "Van" (Type == "Van")이고 & 동력전달장치가 후륜(DriveTrain == "Rear")인 차는 DT data.table 에 존재하지 않기 때문에 <NA>를 반환하였습니다.
# Subset 'all' rows where # where Type matches ("Compact", "Sporty") and DriveTrain matches "Rear". DT[.(c("Compact", "Van", "Sporty"), "Rear")] # default mult = "all" # or equivalently > DT[.(c("Compact", "Van", "Sporty"), "Rear"), mult = "all"] # default Model Type Price DriveTrain 1: 190E Compact 31.9 Rear #<--- first of "Compact" Type & "Rear" DriveTrain 2: 240 Compact 22.7 Rear #<--- last of "Compact" Type & "Rear" DriveTrain 3: <NA> Van NA Rear #<--- first of "Van" Type & "Rear" DriveTrain 4: <NA> Van NA Rear #<--- last of "Van" Type & "Rear" DriveTrain 5: Camaro Sporty 15.1 Rear #<--- first of "Sporty" Type & "Rear" DriveTrain 6: Corvette Sporty 38.0 Rear 7: Mustang Sporty 15.9 Rear 8: RX-7 Sporty 32.5 Rear 9: Firebird Sporty 17.7 Rear #<--- last of "Sporty" Type & "Rear" DriveTrain |
(2) Key 값이 매칭되는 첫번째 행 가져오기: mult = "first" |
Key 중에서 차종(Type)이 "Compact", "Van", "Sporty" 이고 & 동력전달장치(DriveTran)이 "Rear"인 차를 가져온 위의 (1)번 결과 중에서 각 유형별로 첫번째 행(mult = "first")을 가져오시오.
# Subset only the 'first' matching row from all rows # where Type matches ("Compact", "Van", "Sporty") and DriveTrain matches "Rear". > DT[.(c("Compact", "Van", "Sporty"), "Rear"), mult = "first"] Model Type Price DriveTrain 1: 190E Compact 31.9 Rear 2: <NA> Van NA Rear 3: Camaro Sporty 15.1 Rear |
(3) Key 값이 매칭되는 마지막 행 가져오기: mult = "last" |
Key 중에서 차종(Type)이 "Compact", "Van", "Sporty" 이고 & 동력전달장치(DriveTran)이 "Rear"인 차를 가져온 위의 (1)번 결과 중에서 각 유형별로 마지막 행(mult = "last")을 가져오시오.
# Subset only the 'last' matching row from all rows # where Type matches ("Compact", "Van", "Sporty") and DriveTrain matches "Rear". > DT[.(c("Compact", "Van", "Sporty"), "Rear"), mult = "last"] Model Type Price DriveTrain 1: 240 Compact 22.7 Rear 2: <NA> Van NA Rear 3: Firebird Sporty 17.7 Rear
|
(4) Key 값이 매칭되는 마지막 행의 값이 존재하는 행만 가져오기 : mult = "last", nomatch = NULL |
Key 중에서 차종(Type)이 "Compact", "Van", "Sporty" 이고 & 동력전달장치(DriveTran)이 "Rear"인 차를 가져온 위의 (1)번 결과 중에서 각 유형별로 마지막 (mult = "last")을 가져오되, 매칭되는 값이 존재하는 행만(nomatch = NULL) 가져오시오.
# We can choose if queries that do not match should return NA # or be skipped altogether using the nomatch argument.(nomatch = NULL) > DT[.(c("Compact", "Van", "Sporty"), "Rear"), + mult = "last", + nomatch = NULL] Model Type Price DriveTrain 1: 240 Compact 22.7 Rear 2: Firebird Sporty 17.7 Rear
|
[Reference]
* R data.table vignettes: https://cran.r-project.org/web/packages/data.table/vignettes/datatable-keys-fast-subset.html
이번 포스팅이 많은 도움이 되었기를 바랍니다.
행복한 데이터 과학자 되세요.