2017-12-27 4 views
2
a = data.table(id = c(1L, 1L, 2L, 3L, NA_integer_), t = c(1L, 2L, 1L, 2L, NA_integer_), x = 11:15) 
b = data.table(id = 1:2, y = c(11L, 15L)) 

# > a 
# id t x 
# 1: 1 1 11 
# 2: 1 2 12 
# 3: 2 1 13 
# 4: 3 2 14 
# 5: NA NA 15 

# > b 
# id y 
# 1: 1 11 
# 2: 2 15 

a[b, on=.(id), sum(x), by = .(id)] 
# > a[b, on=.(id), sum(x), by = .(id)] 
# id V1 
# 1: 1 23 
# 2: 1 13 

왜 위 쿼리는 두 번째 행에서 id = 2, V1 = 13을 반환하지 않습니까? 나는 비록 by=.EACHI를 이용하여 기대하는 것을 얻을 :data.table의`by`와`.EACHI`

a[b, on=.(id), sum(x), by = .EACHI] 
# > a[b, on=.(id), sum(x), by = .EACHI] 
# id V1 
# 1: 1 23 
# 2: 2 13 

답변

2

권리를 수행 할 때 우리는에서 어떤 변수를 사용하여 조인의 by 매개 변수에 by=.EACHI를 사용해서는 안, 두 data.tables 간의 조인 것 같다 오른쪽 테이블 (b 여기), 결과로 조인 된 테이블에서 액세스 할 수 없기 때문입니다. 그 이유는 첫 번째 쿼리에서 by = .id가 작동하지 않습니다. [= bycols에 의해 = J에서 I] DT 조심 여기 http://franknarf1.github.io/r-tutorial/_book/tables.html

섹션 3.5.3에 명시된 바와 같이

. 그냥 반복 : 단지 by = .EACHI는 에서 작동합니다. = 값으로 다른 입력하는 난의 열 사용할 수

이 쿼리는 나에게 조금 더 위의 문장 이해하는 데 도움이 될가 발생합니다 : id 외에, b에서

a[b, .SD, on = .(id)] 
# id t x 
# 1: 1 1 11 
# 2: 1 2 12 
# 3: 2 1 13 

열을 액세스 할 수 없습니다 이 조인에 대해서는 .SD입니다.

내가 그는 위처럼 참가에 의미 추측 by 중 하나 .EACHI, 또는 쇼, id 아무튼 위의 문제로 (조인 변수 이름이 아닌 왼쪽 테이블에서 열 이름 (여기 a)를 취해야합니다 심지어는 a에도 불구하고 제대로 작동하지 않습니다.) a의 열 이름을 올바르게 사용하는 것 같습니다.

a[b, sum(x), on = .(id), by = .(t)] 
    t V1 
1: 1 24 
2: 2 12 
+1

멋진 답변입니다. Btw, a = b (b, sum (y), on =. (id), by =. (t)]'- by = works이지만 y (b에서)는 찾을 수없는 또 다른 예입니다. – Frank

관련 문제