복붙노트

[SQL] 번역 SQL은 R data.table 구문 외래 키에 조인

SQL

번역 SQL은 R data.table 구문 외래 키에 조인

data.table 패키지는 SQL과 같은 테이블 처리 방법을 많이 제공합니다. 테이블이 키를 가지고 있다면, 그 키는 하나 개 이상의 컬럼으로 구성되어 있습니다. 이 같은 시간에 두 가지 방법으로 분류 할 수 없기 때문에 그러나 테이블은 하나 이상의 키를 가질 수 없습니다.

이 예에서, X 및 Y는 단일 키 열 "ID"와 data.tables이다; Y는 키가 아닌 열 "x_id"을 가지고있다.

   X <- data.table(id = 1:5, a=4:8,key="id")
   Y <- data.table(id = c(1,1, 3,5,7), x_id=c(1,4:1), key="id")

다음 구문은 테이블을 자신의 키에 결합 할 것입니다 :

  X[Y]

어떻게 data.table 코드에 다음과 같은 SQL 구문을 번역 할 수 있습니다?

  select * from X join Y on X.id = Y.x_id; 

내가 찍었을 그 가장 가까운입니다 :

Y[X,list(id, x_id),by = x_id,nomatch=0]

그러나,이 같은 내부는 SQL 문으로 참여하지 않습니다.

여기에 외부 키가 y_id되는 더 명확 예를 들어, 우리는이 Y2 곳 X2 $ y_id = Y2 $ ID의 값을 조회하기 위해 가입합니다.

    X2 <- data.table(id = 1:5, y_id = c(1,1,2,2,2), key="id")
    Y2 <- data.table(id = 1:5, b = letters[1:5], key="id")

나는 테이블을 생성하고 싶습니다 :

   id  y_id  b
    1     1 "a"
    2     1 "a"
    3     2 "b"
    4     2 "b"
    5     2 "b"

다음 kludge에 의해 수행되는 것과 유사 :

> merge(data.frame(X2), data.frame(Y2), by.x = "y_id", by.y = "id")
  y_id id b
1    1  1 a
2    1  2 a
3    2  3 b
4    2  4 b
5    2  5 b

그러나, 나는이 작업을 수행 할 때 :

    X2[Y2, 1:2,by = y_id]

내가 원하는 결과를 얻을하지 않습니다 :

    y_id V1
[1,]    1  1
[2,]    1  2
[3,]    2  1
[4,]    2  2

해결법

  1. ==============================

    1.좋은 질문. ?에서 data.table 다음을 (틀림없이 매장) 참고 :

    좋은 질문. ?에서 data.table 다음을 (틀림없이 매장) 참고 :

    그래서, 여기 열쇠는 내가 키가 될 필요가 없다는 것입니다. 최근 x는 키가 있어야합니다.

    X2 <- data.table(id = 11:15, y_id = c(14,14,11,12,12), key="id")
         id y_id
    [1,] 11   14
    [2,] 12   14
    [3,] 13   11
    [4,] 14   12
    [5,] 15   12
    Y2 <- data.table(id = 11:15, b = letters[1:5], key="id")
         id b
    [1,] 11 a
    [2,] 12 b
    [3,] 13 c
    [4,] 14 d
    [5,] 15 e
    Y2[J(X2$y_id)]  # binary search for each item of (unsorted and unkeyed) i
         id b
    [1,] 14 d
    [2,] 14 d
    [3,] 11 a
    [4,] 12 b
    [5,] 12 b
    

    또는,

    Y2[SJ(X2$y_id)]  # binary merge of keyed i, see ?SJ
         id b
    [1,] 11 a
    [2,] 12 b
    [3,] 12 b
    [4,] 14 d
    [5,] 14 d
    
    identical(Y2[J(X2$y_id)], Y2[X2$y_id])
    [1] FALSE
    
  2. from https://stackoverflow.com/questions/9914734/translating-sql-joins-on-foreign-keys-to-r-data-table-syntax by cc-by-sa and MIT license