data.table
조인 및 병합
수색…
소개
?`[.data.table`
공식 문서.
통사론
- x [i, on, j]
# join : data.table x & data.table 또는 list i - x [! i, on, j]
# anti-join
비고
키가있는 테이블을 사용한 작업
x
와 i
가 키를 가지고 있거나 x
가 i
의 처음 몇 열과 일치하도록 키가 지정 on
있다면, on
은 x[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
직접 작업 할 수 있습니다.
별도의 테이블 사용시 장점
이 구조의 이점은 깔끔한 데이터에 대한 논문에서 다루지 만, 다음과 같은 맥락에서 볼 수 있습니다.
누락 된 데이터 추적. 병합에서 일치하는 행만 할당을받습니다. 위의
geo_id == "MO"
대한 데이터가 없으므로 변수는 최종 테이블에서NA
입니다. 이와 같이 누락 된 데이터가 예기치 않게geoDT
경우geoDT
테이블에서 누락 된 데이터를 추적하여 데이터 문제가 있는지 여부를 조사 할 수 있습니다.이해력. 통계 모델을 구축 할 때
budget
은 각 출연자마다 일정해야 함을 명심해야합니다. 일반적으로 데이터 구조를 이해하면 배당금이 지급됩니다.메모리 크기. 통계 모델에서 끝나지 않는 많은 수의 출연자 및 위치 속성이있을 수 있습니다. 이렇게하면 분석에 사용 된 테이블 (아마도 대량)에 포함 할 필요가 없습니다.
프로그래밍 방식으로 열 결정
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.12 및 2.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
각 행에 대한 일치 항목 수를 계산하려면 .N
및 by=.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