수색…


소개

조인은 관련 열을 포함하는 두 개의 테이블을 결합합니다. 이 용어는 두 테이블을 추가하는 것을 제외하고는 기본적으로 모든 작업을 포괄합니다. "병합"은 동의어입니다. 형식 ?`[.data.table` 공식 문서.

통사론

  • x [i, on, j]
    # join : data.table x & data.table 또는 list i
  • x [! i, on, j]
    # anti-join

비고

키가있는 테이블을 사용한 작업

xi키를 가지고 있거나 xi 의 처음 몇 열과 일치하도록 키가 지정 on 있다면, onx[i] 처럼 스킵 될 수 있습니다.

열 이름을 공통으로 모호하게 함

j x[i, on, j] 에서 i 열은 i.* 접두어로 참조 할 수 있습니다.

하위 집합으로 그룹화

j x[i, on, j, by=.EACHI]j 에서 i 각 행에 대해 j 가 계산됩니다.

이 유일한 값 by 사용 가치. 다른 값에 대해의 열 i 사용할 수 없습니다.

조인의 값 업데이트

데이터가 "깔끔한" 경우에는 종종 여러 테이블로 구성됩니다. 분석을 위해 데이터를 결합하려면 한 테이블을 다른 테이블의 값으로 "업데이트"해야합니다.

예를 들어 퍼포머의 속성 (예산)과 위치 (인구)가 별도의 테이블에 저장되는 퍼포먼스에 대한 판매 데이터가있을 수 있습니다.

set.seed(1)
mainDT = data.table(
  p_id = rep(LETTERS[1:2], c(2,4)), 
  geo_id = sample(rep(state.abb[c(1,25,50)], 3:1)), 
  sales = sample(100, 6)
)
pDT   = data.table(id = LETTERS[1:2], budget = c(60, 75))
geoDT = data.table(id = state.abb[c(1,50)], pop = c(100, 200))

mainDT # sales data
#    p_id geo_id sales
# 1:    A     AL    95
# 2:    A     WY    66
# 3:    B     AL    62
# 4:    B     MO     6
# 5:    B     AL    20
# 6:    B     MO    17


pDT # performer attributes
#    id budget
# 1:  A     60
# 2:  B     75

geoDT # location attributes
#    id pop
# 1: AL 100
# 2: WY 200

몇 가지 분석을 할 준비가되면 다음 테이블에서 변수를 가져와야합니다.

DT = copy(mainDT)

DT[pDT, on=.(p_id = id), budget := i.budget]
DT[geoDT, on=.(geo_id = id), pop := i.pop]

#    p_id geo_id sales budget pop
# 1:    A     AL    95     60 100
# 2:    A     WY    66     60 200
# 3:    B     AL    62     75 100
# 4:    B     MO     6     75  NA
# 5:    B     AL    20     75 100
# 6:    B     MO    17     75  NA

copy 은 원시 데이터를 오염시키지 않도록 취해 mainDT 대신 mainDT 직접 작업 할 수 있습니다.

별도의 테이블 사용시 장점

이 구조의 이점은 깔끔한 데이터에 대한 논문에서 다루지 만, 다음과 같은 맥락에서 볼 수 있습니다.

  1. 누락 된 데이터 추적. 병합에서 일치하는 행만 할당을받습니다. 위의 geo_id == "MO" 대한 데이터가 없으므로 변수는 최종 테이블에서 NA 입니다. 이와 같이 누락 된 데이터가 예기치 않게 geoDT 경우 geoDT 테이블에서 누락 된 데이터를 추적하여 데이터 문제가 있는지 여부를 조사 할 수 있습니다.

  2. 이해력. 통계 모델을 구축 할 때 budget 은 각 출연자마다 일정해야 함을 명심해야합니다. 일반적으로 데이터 구조를 이해하면 배당금이 지급됩니다.

  3. 메모리 크기. 통계 모델에서 끝나지 않는 많은 수의 출연자 및 위치 속성이있을 수 있습니다. 이렇게하면 분석에 사용 된 테이블 (아마도 대량)에 포함 할 필요가 없습니다.

프로그래밍 방식으로 열 결정

pDT 많은 열이 있지만 몇 개만 선택하려는 경우 다음을 사용할 수 있습니다.

p_cols = "budget"
DT[pDT, on=.(p_id = id), (p_cols) := mget(sprintf("i.%s", p_cols))]

(p_cols) := 주변의 괄호는 필수 항목이며 열 작성대한 문서에 명시되어 있습니다 .

동등 조인

# example data
a = data.table(id = c(1L, 1L, 2L, 3L, NA_integer_), x = 11:15)
#    id  x
# 1:  1 11
# 2:  1 12
# 3:  2 13
# 4:  3 14
# 5: NA 15

b = data.table(id = 1:2, y = -(1:2))
#    id  y
# 1:  1 -1
# 2:  2 -2

직관

x[i]i 각 행에 대해 x 의 부분 집합을 선택한다고 생각하십시오. 이 구문은베이스 R에서의 행렬 부분 집합을 반영하며 첫 번째 인수와 일치합니다 ( DT[where, select|update|do, by] 에서 "where"를 의미 함 DT[where, select|update|do, by] .

merge(x,i) 여전히 data.tables와 작동하기 때문에 왜이 새로운 구문이 학습 가치가 있는지 궁금해 할 것입니다. 짧은 대답은 우리가 일반적으로 병합하고 더 나아가 뭔가하고 싶어한다는 것입니다. x[i] 구문은이 사용 패턴을 간결하게 캡처하고 더 효율적인 계산을 허용합니다. 자세한 설명은 FAQs 1.122.14를 참조하십시오 .

다중 일치 행 처리

기본적으로 모든 행 일치의 각 행 a b 반환됩니다

a[b, on="id"]
#    id  x  y
# 1:  1 11 -1
# 2:  1 12 -1
# 3:  2 13 -2

mult 로 조정할 수 있습니다.

a[b, on="id", mult="first"]
#    id  x  y
# 1:  1 11 -1
# 2:  2 13 -2

일치하지 않는 행 처리

기본적으로의 타의 추종을 불허하는 행 a 여전히 결과에 표시 :

b[a, on="id"]
#    id  y  x
# 1:  1 -1 11
# 2:  1 -1 12
# 3:  2 -2 13
# 4:  3 NA 14
# 5: NA NA 15

이것을 숨기려면 nomatch 사용 nomatch .

b[a, on="id", nomatch=0]
#    id  y  x
# 1:  1 -1 11
# 2:  1 -1 12
# 3:  2 -2 13

x[i]i NA를 일치 시키려고한다.

계산 일치가 반환되었습니다.

i 각 행에 대한 일치 항목 수를 계산하려면 .Nby=.EACHI .

b[a, on="id", .N, by=.EACHI]
#    id N
# 1:  1 1
# 2:  1 1
# 3:  2 1
# 4:  3 0
# 5: NA 0


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow