r 왼쪽 조인(한 열)에 대한 데이터 테이블 구문



data.table (1)

내가 선호하는 구문에 대해 어떻게 생각해야할까요?

내 기준은 효율성 (1 위)과 가독성 / 유지 가능성입니다.

A <- B[A, on = .(id)] # wow such. concision

또는

A[B, on = .(id), comment := i.comment]

아니면 (PoGibas가 제안한대로) :

A <- merge(A, B, all.x = TRUE)

완성을 위해보다 기본적인 방법은 match() 를 사용하는 것입니다.

A[, comment := B[chmatch(A[["id"]], id), comment]]

예제 데이터 :

library(data.table)
A <- data.table(id = letters[1:10], amount = rnorm(10)^2)
B <- data.table(id = c("c", "d", "e"), comment = c("big", "slow", "nice"))

효율성과 유지 보수성을 위해 "업데이트 참여"관용구를 선호합니다. **

DT[WHERE, v := FROM[.SD, on=, x.v]]

이는 vignette("datatable-reference-semantics") 일부 열 행 업데이트 - 참조로 하위 할당 vignette("datatable-reference-semantics") 에서 vignette("datatable-reference-semantics") 에 표시된 내용의 확장입니다. 조인에 사용할 수있는 비 네트가 있으면 좋은 참조가되어야합니다.

이는 WHERE 선택한 행만 사용하고 더 간결한 왼쪽 조인 FROM[DT, on=] 과 같은 새 테이블을 만드는 대신 해당 열을 수정하거나 추가하기 때문에 효율적입니다.

조인의 포인트가 열 v 를 추가하는 것임을 쉽게 알 수 있으므로 내 코드를 더 쉽게 읽을 수 있습니다. SQL에서 "왼쪽"/ "오른쪽"특수 용어 또는 행 수를 조인 후에 보존할지 여부를 생각할 필요가 없습니다.

나중에 DT v 라는 열이있는 것을 찾으려면 v := 대한 코드를 검색 할 수 있으므로 FROM[DT, on=] 은 새 열을 추가하지 못하게하므로 코드 유지 관리에 유용합니다. 또한 WHERE 조건을 허용하지만 왼쪽 조인은 허용하지 않습니다. 예를 들어 FROM 을 사용하여 기존 열에서 NA를 "채우는" 경우에 유용 할 수 있습니다.

다른 업데이트 조인 방식 인 DT[FROM, on=, v := iv] 와 비교할 때 두 가지 이점을 생각해 볼 수 있습니다. 첫 번째는 WHERE 절을 사용하는 옵션이고 두 번째는 on= 규칙의 FROM 조건부에서 중복 일치와 같이 조인에 문제가있을 때 경고를 통한 투명성입니다. 다음은 OP의 예를 확장 한 그림입니다.

library(data.table)
A <- data.table(id = letters[1:10], amount = rnorm(10)^2)
B2 <- data.table(
  id = c("c", "d", "e", "e"), 
  ord = 1:4, 
  comment = c("big", "slow", "nice", "nooice")
)

# left-joiny update
A[B2, on=.(id), comment := i.comment, verbose=TRUE]
# Calculated ad hoc index in 0.000s elapsed (0.000s cpu) 
# Starting bmerge ...done in 0.000s elapsed (0.000s cpu) 
# Detected that j uses these columns: comment,i.comment 
# Assigning to 4 row subset of 10 rows

# my preferred update
A[, comment2 := B2[A, on=.(id), x.comment]]
# Warning message:
# In `[.data.table`(A, , `:=`(comment2, B2[A, on = .(id), x.comment])) :
#   Supplied 11 items to be assigned to 10 items of column 'comment2' (1 unused)

    id     amount comment comment2
 1:  a 0.20000990    <NA>     <NA>
 2:  b 1.42146573    <NA>     <NA>
 3:  c 0.73047544     big      big
 4:  d 0.04128676    slow     slow
 5:  e 0.82195377  nooice     nice
 6:  f 0.39013550    <NA>   nooice
 7:  g 0.27019768    <NA>     <NA>
 8:  h 0.36017876    <NA>     <NA>
 9:  i 1.81865721    <NA>     <NA>
10:  j 4.86711754    <NA>     <NA>

id == "e" 대해 두 개의 일치 항목이 있더라도 왼쪽 조인 맞춤 업데이트에서는 자동으로 comment 의 최종 값을 얻습니다. 다른 업데이트에서는 도움이되는 경고 메시지가 표시됩니다 ( 이후 릴리스에서 오류로 업그레이드 됨). 왼쪽 조이너 방식을 사용하여 verbose=TRUE 로 설정하는 것도 유익하지 않습니다. 업데이트되는 행이 4 개이지만 한 행이 두 번 업데이트되고 있다고는 말하지 않습니다.

이 방법은 데이터가 깔끔하고 관계형 테이블 집합으로 정렬 될 때 가장 잘 작동하는 것으로 나타났습니다. Hadley Wickham의 논문 이 좋은 참고 자료입니다.

**이 관용구에서 on= 부분은 on=.(id) 또는 on=.(from_date >= dt_date) 과 같이 조인 열 이름 및 규칙으로 on=.(from_date >= dt_date) . roll= , mult=nomatch= 와 함께 추가 조인 규칙을 전달할 수 있습니다. 자세한 내용은 ?data.table 을 참조하십시오. 의견에이 점을 지적 해 주신 @RYoda에게 감사드립니다.

다음은 Matt Dowle이 roll= 설명하는보다 복잡한 예제 입니다. 각 행에 대해 특정 값의 가장 가까운 발생 시간을 찾습니다 .

또 다른 관련 예제 : data.table을 사용한 왼쪽 조인





data.table