자체 - 데이터 베이스 outer join



X[Y]가 data.tables의 조인을하는 이유는 완전 외부 조인 또는 왼쪽 조인을 허용하지 않기 때문입니다. (2)

@ mnel의 대답은 자리에 있으므로 대답을 수락하십시오. 이것은 단지 후속 조치이며, 너무 오랫동안 의견을 말하고 있습니다.

mnel이 말했듯이, 왼쪽과 오른쪽 외부 조인은 YX 를 교환하여 얻어진다 : Y[X] -vs- X[Y] . 따라서 4 개의 조인 유형 중 3 개가 2, iiuc가 아닌 해당 구문에서 지원됩니다.

4 번째를 추가하는 것이 좋습니다. 우리가 full=TRUE 또는 both=TRUE 또는 merge=TRUE 추가한다고 가정 해 봅시다. (가장 좋은 인수 이름이 확실하지 않습니까?) 그런 다음 X[Y,j,merge=TRUE] 질문 후 1.12. 이제 새로운 기능 요청이 여기에 추가되고 연결되었습니다. 감사합니다.

FR # 2301 : merge ()처럼 X [Y]와 Y [X] join에 merge = TRUE 인수를 추가하십시오.

최근 버전에서는 merge.data.table 속도가 빨라 merge.data.table (예 : 내부적으로 얕은 복사본을 사용하여 키를보다 효율적으로 설정). 그래서 우리는 merge()X[Y] 더 가깝게 만들려고 노력하고 있으며 사용자에게 모든 옵션을 제공하여 유연성을 극대화합니다. 두 가지 장단점이 있습니다. 또 다른 뛰어난 기능 요청은 다음과 같습니다.

FR # 2033 : merge.data.table에 by.x와 by.y를 추가하십시오.

다른 것이 있으면 계속 오십시오.

이 부분의 질문 :

match 함수의 nomatch 매개 변수가 아니라 조인에 병합 구문을 사용하지 않는 이유는 무엇입니까?

merge() 구문과 3 개의 인수 all , all.xall.y 를 선호하는 경우 X[Y] 대신 해당 구문을 사용하십시오. 모든 경우를 다루어야한다고 생각하십시오. 아니면 왜 인수가 [.data.table ?]의 단일 [.data.table 입니까? 그렇다면, 그것은 자연스럽게 보이는 것처럼 보입니다. FAQ 2.14 : "data.table이 A [B] 구문의 기초에서 영감을받은 이유를 더 자세히 설명 할 수 있습니까?" 또한 nomatch 는 현재 0NA 라는 두 가지 값만 사용합니다. 그것은 음수 값이 의미를 갖도록 확장 될 수 있습니다. 예를 들어, 12는 NAs를 채우기 위해 12 번째 행의 값을 사용함을 의미합니다. 또는 앞으로의 nomatch 은 벡터 또는 자체적으로 data.table 있습니다.

흠. merge = TRUE와 어떻게 상호 작용합니까? 아마도 이것을 datatable-help 로 가져 가야 할 것입니다.

이것은 data.table 조인 구문에 대한 약간의 철학적 질문입니다. data.tables에 대한 사용이 점점 늘어나고 있지만 여전히 배우고 있습니다.

data.tables에 대한 조인 형식 X[Y] 는 매우 간결하고 편리하며 효율적입니다. 그러나 알 수 있듯이 내부 조인과 외부 조인 만 지원합니다. 왼쪽 또는 완전 외부 조인을 얻으려면 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 = 0nomatch = NA 매개 변수 값은 수행되는 작업에 대해 매우 직관적이지 않습니다. merge 구문을 이해하고 기억하는 것이 더 쉽습니다. all = TRUE , all.x = TRUEall.y = TRUE . X[Y] 연산은 match 보다 훨씬 더 merge 과 비슷하기 때문에 match 함수의 nomatch 매개 변수가 아니라 조인에 merge 구문을 사용하는 것이 좋습니다.

다음은 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이 처리 할 수있는 추가 조인 유형의 몇 가지 예를 제공합니다.


이 "대답"은 토론을위한 제안입니다. 제 의견에 언급했듯이 추가 유형의 조인 (예 : X[Y,j,join=string] )을 사용하려면 [.data.table ()에 join 매개 변수를 추가하는 것이 좋습니다. 4 가지 유형의 일반 조인 외에도 3 가지 유형의 배타적 조인과 교차 조인을 지원하는 것이 좋습니다.

다양한 조인 유형에 대한 join 문자열 값 (및 별칭)은 다음과 같이 제안됩니다.

  1. "all.y""right" - 오른쪽 조인, 현재 data.table 기본값 (nomatch = NA) - X 일치가없는 NAs가있는 모든 Y 행.
  2. "both""inner" - inner join (nomatch = 0) - X와 Y가 일치하는 행만;

  3. "all.x""left" - 왼쪽 조인 - X, NAs의 모든 행 (Y는 일치하지 않음) :

  4. "outer""full" - 전체 외부 조인 - X와 Y의 모든 행, 일치하지 않는 NAs

  5. "only.x""not.y" - Y 일치가없는 X 행을 반환하는 비 조인 또는 비 조인

  6. "only.y""not.x" - X 일치가없는 Y 행을 반환하는 비 조인 또는 비 조인
  7. "not.both" - 다른 테이블과 일치하지 않는 X 및 Y 행을 반환하는 배타적 조인 즉, 배타적 논리합 (XOR)
  8. "cross" - X의 각 행이 Y의 각 행과 일치하는 교차 결합 또는 데카르트 곱

기본값은 현재 기본값에 해당하는 join="all.y" 입니다.

"all", "all.x"및 "all.y"문자열 값은 merge() 매개 변수에 해당합니다. "오른쪽", "왼쪽", "내부"및 "외부"문자열은 SQL 사용자에게보다 적합 할 수 있습니다.

"both"및 "not.both"문자열은 현재 내 최고의 제안이지만 내부 조인과 배타적 조인에 대한 문자열 제안이 더 좋습니다. ( "독점"이 올바른 용어인지 확실하지 않은 경우, "XOR"조인을위한 적절한 용어가 있으면 저를 수정하십시오.)

join="not.y"X[-Y,j] 또는 X[!Y,j] 비 조인 구문에 대한 대안이며 X[!Y,j] 분명히 (나에게) 더 명확하다. 같은 (data.table 버전 1.8.3의 새로운 기능).

십자가 조인은 때때로 편리 할 수 ​​있지만 data.table 패러다임에 맞지 않을 수 있습니다.





data.table