이것은 data.table 조인 구문에 대한 약간의 철학적 질문입니다. 나는 data.tables에 대한 더 많은 용도를 찾고 있지만 여전히 배우고 있습니다 ...
X[Y]
data.tables 의 조인 형식 은 매우 간결하고 편리하며 효율적이지만 제가 알 수있는 한 내부 조인과 오른쪽 외부 조인 만 지원합니다. 왼쪽 또는 전체 외부 조인을 얻으려면 다음을 사용해야합니다 merge
.
X[Y, nomatch = NA]
-Y의 모든 행-오른쪽 외부 결합 (기본값)X[Y, nomatch = 0]
-X와 Y 모두 일치하는 행만-내부 조인merge(X, Y, all = TRUE)
-X와 Y 모두의 모든 행-완전 외부 결합merge(X, Y, all.x = TRUE)
-X의 모든 행-왼쪽 외부 결합
X[Y]
조인 형식이 4 가지 유형의 조인을 모두 지원 하면 편리 할 것 같습니다 . 두 가지 유형의 조인 만 지원되는 이유가 있습니까?
나에게 nomatch = 0
및 nomatch = NA
매개 변수 값은 수행중인 작업에 대해 그다지 직관적이지 않습니다. merge
구문 을 이해하고 기억하는 것이 더 쉽습니다 : all = TRUE
, all.x = TRUE
및 all.y = TRUE
. X[Y]
연산 merge
이보다 훨씬 더 비슷 하므로 함수의 매개 변수 대신 조인 구문을 match
사용하지 않는 이유는 무엇입니까?merge
match
nomatch
다음은 4 가지 조인 유형의 코드 예입니다.
# sample X and Y data.tables
library(data.table)
X <- data.table(t = 1:4, a = (1:4)^2)
setkey(X, t)
X
# t a
# 1: 1 1
# 2: 2 4
# 3: 3 9
# 4: 4 16
Y <- data.table(t = 3:6, b = (3:6)^2)
setkey(Y, t)
Y
# t b
# 1: 3 9
# 2: 4 16
# 3: 5 25
# 4: 6 36
# all rows from Y - right outer join
X[Y] # default
# t a b
# 1: 3 9 9
# 2: 4 16 16
# 3: 5 NA 25
# 4: 6 NA 36
X[Y, nomatch = NA] # same as above
# t a b
# 1: 3 9 9
# 2: 4 16 16
# 3: 5 NA 25
# 4: 6 NA 36
merge(X, Y, by = "t", all.y = TRUE) # same as above
# t a b
# 1: 3 9 9
# 2: 4 16 16
# 3: 5 NA 25
# 4: 6 NA 36
identical(X[Y], merge(X, Y, by = "t", all.y = TRUE))
# [1] TRUE
# only rows in both X and Y - inner join
X[Y, nomatch = 0]
# t a b
# 1: 3 9 9
# 2: 4 16 16
merge(X, Y, by = "t") # same as above
# t a b
# 1: 3 9 9
# 2: 4 16 16
merge(X, Y, by = "t", all = FALSE) # same as above
# t a b
# 1: 3 9 9
# 2: 4 16 16
identical( X[Y, nomatch = 0], merge(X, Y, by = "t", all = FALSE) )
# [1] TRUE
# all rows from X - left outer join
merge(X, Y, by = "t", all.x = TRUE)
# t a b
# 1: 1 1 NA
# 2: 2 4 NA
# 3: 3 9 9
# 4: 4 16 16
# all rows from both X and Y - full outer join
merge(X, Y, by = "t", all = TRUE)
# t a b
# 1: 1 1 NA
# 2: 2 4 NA
# 3: 3 9 9
# 4: 4 16 16
# 5: 5 NA 25
# 6: 6 NA 36
업데이트 : data.table v1.9.6 on=
은 기본 키가 아닌 필드에 대한 임시 조인을 허용 하는 구문을 도입했습니다 . 데이터 프레임 (내부, 외부, 왼쪽, 오른쪽)을 결합 (병합)하는 방법에 대한 jangorecki의 답변 은 무엇입니까? data.table이 처리 할 수있는 추가 조인 유형의 몇 가지 예를 제공합니다.
unique()
전체 조인에 대한 아래 의 접근 방식이 rbind(Y[X],X[Y])
. 맞습니까?
unique(c(unique(X[,t]), unique(Y[,t]))
X와 Y의 행 수보다 작거나 같은 두 개의 목록 만 결합하므로 메모리 효율성이 더 높아야합니다). .
Y[X]
당신이 원하는 경우 왼쪽 외부 조인 의X[Y]
와rbind(Y[X],X[Y])
는 완전 외부를 원하는 경우에 가입