programing

data.tables의 X[Y] join이 전체 외부 join 또는 왼쪽 join을 허용하지 않는 이유는 무엇입니까?

starjava 2023. 7. 16. 12:26
반응형

data.tables의 X[Y] join이 전체 외부 join 또는 왼쪽 join을 허용하지 않는 이유는 무엇입니까?

이것은 data.table join 구문에 대한 약간의 철학적인 질문입니다.점점 더 많은 data.tables의 용도를 찾고 있지만, 여전히 배우고 있습니다...

형식 인식X[Y]data.tables는 매우 간결하고 편리하며 효율적이지만, 제가 알기로는 내부 조인과 오른쪽 외부 조인만 지원합니다. 또는 조인을 왼쪽또전체외조부얻인합사니다야용해면으려을는합다니를 해야 합니다.merge:

  • X[Y, nomatch = NA]Y의 모든 행 - 오른쪽 외부 조인(기본값)
  • X[Y, nomatch = 0]Y가 만 -- inner joinXY를 선택합니다. --
  • 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]이 유한작업과 합니다.mergematch를 사용하는 것이 어떻습니까?merge 대구문한이 아닌 matchnomatch매개 변수?

다음은 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

v1: data.table v1.9.6이 도입되었습니다.on=기본 키 이외의 필드에서 임시 조인을 허용하는 구문입니다. 데이터 프레임(내부, 외부, 왼쪽, 오른쪽)을 조인하는 방법에 대한 장고레키의 대답은?에서는 data.table이 처리할 수 있는 추가 조인 유형의 몇 가지 예를 제공합니다.

에서인자면에서 data.table 1 FAQ 1.의 차이점은 입니까?X[Y]그리고.merge(X, Y)?

X[Y]Y(또는 Y 키가 있는 경우)를 인덱스로 사용하여 X의 행을 조회하는 조인입니다.

Y[X]는 X가 있으면 키를입니다.

merge(X,Y)두 가지 방법을 동시에 수행합니다.의 행 행 수X[Y]그리고.Y[X]은 다르지만, 일적으다반른반행수의에 의해 .merge(X,Y)그리고.merge(Y,X)똑같습니다.

하지만 그것은 요점을 놓치고 있습니다.대부분의 작업은 조인 또는 병합 후 데이터에 대해 수행해야 합니다.데이터의 모든 열을 병합하고 나중에 작은 부분 집합만 사용하는 이유는 무엇입니까?당신은 제안할 수 있습니다.merge(X[,ColsNeeded1],Y[,ColsNeeded2])그러나 이를 위해서는 프로그래머가 어떤 열이 필요한지 알아내야 합니다. X[Y,j합니다.data.table은 사용자를 사용됩니다.▁▁you▁when을글당을 쓸 때.X[Y,sum(foo*bar)]data.table은 자동으로 검사합니다.j사용할 열을 확인하는 식입니다.이 열은 해당 열의 부분 집합만 지정하고 나머지 열은 무시됩니다.메모리는 열에 대해서만 생성됩니다.j용도 및Y열은 각 그룹의 컨텍스트 내에서 표준 R 재활용 규칙을 사용합니다.예를 들어foo안에 있습니다.X그리고 바가 있습니다.Y 열과 )Y. 그렇지 않습니다.X[Y,sum(foo*bar)]모든 것을 낭비적으로 병합하고 하위 집합을 따르는 것보다 프로그래밍하는 것과 실행하는 것이 더 빠릅니까?


이 쪽왼외조원의 조인을 .X[Y]

le <- Y[X]
mallx <- merge(X, Y, all.x = T)
# the column order is different so change to be the same as `merge`
setcolorder(le, names(mallx))
identical(le, mallx)
# [1] TRUE

전체 외부 결합을 원하는 경우

# the unique values for the keys over both data sets
unique_keys <- unique(c(X[,t], Y[,t]))
Y[X[J(unique_keys)]]
##   t  b  a
## 1: 1 NA  1
## 2: 2 NA  4
## 3: 3  9  9
## 4: 4 16 16
## 5: 5 25 NA
## 6: 6 36 NA

# The following will give the same with the column order X,Y
X[Y[J(unique_keys)]]

@mnel의 대답은 정확합니다, 그러니 그 대답을 받아들이십시오.이것은 단지 후속 조치일 뿐입니다. 댓글을 달기에는 너무 깁니다.

작업자가 말하는 바와 같이 좌측/우측 외측 조인은 스왑을 통해 얻을 수 있습니다.Y그리고.X:Y[X]-vs-X[Y]따라서 4개의 조인 유형 중 3개는 2, iuc가 아닌 해당 구문에서 지원됩니다.

4번째를 추가하는 것은 좋은 생각인 것 같습니다.우리가 추가한다고 치자.full=TRUE또는both=TRUE또는merge=TRUE 이름이 하지 않나요 그 이 들지 않았습니다.X[Y,j,merge=TRUE]FAQ 1.12의 BUT 이후의 이유로 유용할 것입니다.되어 여기에합니다. : 새기능요추여가다기연다니습었되결시에어되청이▁new다니▁thanks. 감사합니다.

FR#2301 : 병합= 추가병합()과 마찬가지로 X[Y] 및 Y[X] 모두에 대한 TRUE 인수입니다.

최근 버전은 속도가 빨라졌습니다.merge.data.table(예를 들어 키를 보다 효율적으로 설정하기 위해 내부적으로 얕은 복사본을 가져옴).그래서 우리는 우리가 가지고 오려고 노력하고 있습니다.merge()그리고.X[Y]모든 옵션을 사용자에게 제공하여 완벽한 유연성을 제공합니다.둘 다 장단점이 있습니다. 다른 :: " 다른미결같다습다니과또음은청요기능해▁:▁is▁request▁another다또같니습▁out▁featurestanding다과"입니다.

FR#2033 : by.x 및 by.y를 merge.data.table에 추가합니다.

다른 사람들이 있으면 계속 와주세요.

질문의 이 부분까지:

일치 함수의 일치하지 않는 매개 변수 대신 병합 구문을 사용하는 것이 어떻습니까?

원하신다면merge() 및 의 인수 문개및 3의인수all,all.x그리고.all.y그러면 그것을 사용하지 말고 사용하세요.X[Y]모든 사건을 다루어야 한다고 생각합니다.아니면 왜 그 주장이 단일인지를 의미하는 것입니까?nomatch[.data.table그렇다면 FAQ 2.14에서 "data.table이 A[B] 기본 구문에서 영감을 얻은 이유를 더 설명할 수 있습니까?"라고 물었을 때 당연한 것처럼 보였습니다.하지만 또한,nomatch 현두 개의 값만사용니다합재▁▁values다▁two 두 개의 만 사용합니다.0그리고.NA것이 도 있고, 를 들어,의 값을 , 12번째 줄의 값을 하는 것을 도 있습니다.nomatch미래에는 벡터가 될 수도 있고 심지어 그 자체가 될 수도 있습니다.data.table.

흠. by-with-by는 merge=TRUE와 어떻게 상호 작용합니까?아마도 우리는 이것을 데이터 테이블 도움말로 넘겨야 할 것입니다.

토론을 입니다: "답변"입니다.내 의견에 나타난 바와 같이, 나는 다음을 추가할 것입니다.join에 대한 하여 추가 조인 합니다. [.data.table]의 경우는 다음과 같습니다.X[Y,j,join=string]일반 조인의 4가지 유형 외에 독점 조인, 크로스 조인의 3가지 유형도 지원할 것을 제안합니다.

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

  1. "all.y"그리고."right"join, data.table defaultnomatch=", "notmatch .table"("table"=) - X가 일치하지 않는 있는 Y;
  2. "both"그리고."inner"join ) - 만; 내일결합 (않지하음가는=0) - X와 Y하행만;

  3. "all.x"그리고."left"왼쪽 조인 - 일치하는 Y가 없는 X, NA의 모든 행:

  4. "outer"그리고."full"조인 - XY의 행, 일치하지 않는 - X 및 Y 든 행 의 조 않 NA

  5. "only.x"그리고."not.y"Y 인 또는 X 행

  6. "only.y"그리고."not.x" Y 행을 Y 행
  7. "not.both"하는 항목이 X 및합니다. 즉 ( X 및 Y 반 Y 배 Y 조 (exclusive join), 즉 X 또-는 (XOR)
  8. "cross"X의 각 행이 Y의 각 행과 일치하는 교차 결합 또는 데카르트

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

"all "all", "all "all" 입니다.x" " 두모열 . 은 y " 문자값다같습니다과음은""에 해당합니다.merge()SQL 및 " 문자열을 더 사용할 수 .SQL 사용자는 "오른쪽", "왼쪽", "내부" 및 "외부" 문자열을 더 쉽게 사용할 수 있습니다.

"both"와 "not.both" 문자열이 현재 제가 가장 잘 제안하는 항목이지만, 내부 조인과 배타적 조인에 대해 더 나은 문자열 제안이 있을 수도 있습니다.("exclusive"가 올바른 용어인지 잘 모르겠습니다. "XOR" 가입에 대한 적절한 용어가 있으면 수정하십시오.)

사용join="not.y"는 의대니다의 입니다.X[-Y,j]또는X[!Y,j]비조인 구문과 더 명확할 수도 있습니다(내게는). 동일한지는 모르겠지만(data.table 버전 1.8.3의 새로운 기능).

교차 결합은 때때로 유용할 수 있지만 data.table 패러다임에는 적합하지 않을 수 있습니다.

언급URL : https://stackoverflow.com/questions/12773822/why-does-xy-join-of-data-tables-not-allow-a-full-outer-join-or-a-left-join

반응형