2017-03-09 1 views
0

은 단순히 2 datables의 가입 않는 조인중복 (COL)는 다음과 같이

set.seed(1) 
DT1 <- data.table(
Idx = rep(1:100), 
x1 = round(rnorm(100,0.75,0.3),2), 
x2 = round(rnorm(100,0.75,0.3),2), 
x3 = round(rnorm(100,0.75,0.3),2)) 

DT2 <- data.table(
Idx2 = rep(1:100), 
x1 = round(rep(pi,100),2), 
targetcol = rep(999,100)) 

DT2[DT1,on = c(Idx2 = "Idx")] 

이 작동하지만 원하지 않는 결과의 열 i.x1이 있습니다. 나는 단지 'targetcol', 따라서 이름을 포함하고 싶다. 이제 문제는 또 다른 예에서, 나는 그들 앞에 'i'가있는 이러한 중복 열이 많기 때문에 병합 중에 병합을 삭제하거나 더 잘 제외하고 싶습니다. 나는 이것이 X[Y,.(...)]으로 가능해야한다는 것을 알고 있지만 에 점들을 채우는 올바른 방법을 찾지 못했다. 즉, i.x1을 제외하고 모두 하나의 열을 제외하고 모두. 그래서 위의 목록 구문을 사용하여 데이터 테이블에서 여러 열을 선택하는 가장 좋은 방법은 무엇입니까?

둘째 I는 데이터 테이블의 최신 병합 구하려고 :

merge(x = DT1, y = DT2[,c("Idx2","targetcol")], by.x = "Idx",by.y = "Idx2", all.x=TRUE) 

을하지만 (x1.xx1.y)을 명명 다른 열의 순서로 연결하고, 또한, I는 다른 방법보다 느린 판독.

이 문제를 해결하는 가장 좋은 방법은 무엇입니까 (더 많은 열과 중복이있는 경우에도이 문제를 설명하기위한 것일뿐입니다)?

+0

대해'DT2 [DT1 [- "X1"] = C를 (Idx2 = "하고 Idx")에]' – HubertL

+0

확인 감사, 이제는 j 표현식의 일반적인 목록 구문과 아무런 관련이 없습니다. 그래도 목록 구문을 사용하려면 한 번만 열을 선택하면 될까요? Sthg는'. (Idx2, x1, x2, x3, targetcol) '과 유사하지만 더 간결합니까? 또한 열의 순서는 'merge'와 다릅니다. – user3032689

답변

2

대답 HubertL 코드에서 약간의 수정과 의견에서 이동

DT1[DT2[, .(Idx2, targetcol)], on = c(Idx = "Idx2")]