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