지난번 포스팅에서는 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


이번 포스팅이 많은 도움이 되었기를 바랍니다. 

행복한 데이터 과학자 되세요. 



728x90
반응형
Posted by Rfriend
,