2011-01-21 2 views
13

UPDATE : 오래된 질문 ...이 2 월 data.table v1.5.3에 의해 해결 된 2011 년R : data.table을 사용할 때 x [y]를 할 때 y의 열을 얻는 방법은 무엇입니까?

, 나는 data.table 패키지를 사용하려고하고, 정말 속도 향상처럼 내가 얻고 있지만, 나는 내가 x[y, <expr>]xy가 같은 키 "데이터 테이블"입니다 수행이 오류로 난처한 상황에 빠진, 그리고 <expr> 모두 xy의 열 이름을 포함하고있다 :

require(data.table) 
x <- data.table(foo = 1:5, a = 5:1) 
y <- data.table(foo = 1:5, boo = 10:14) 
setkey(x, foo) 
setkey(y, foo) 
> x[y, foo*boo] 
Error in eval(expr, envir, enclos) : object 'boo' not found 

UPDA TE ... 내가 위의 예에서 찾고 있어요 기능을 명확히하기 위해 : 그러나 data.table 자주 묻는 질문에서 아래의 추출물에 따라

with(merge(x,y), foo*boo) 

이,이 일을해야 : 나는 다음에 해당 할 필요 :

마지막으로, x는 [Y]를 Y에 열을 반환하지 않습니다하지만, 실제로 J 발현에 Y로부터 열을 사용할 수 있습니다로 나타납니다 있지만. 이것은 우리가 에서 조인 한 계승 범위를 의미합니다. 왜 x와 y에서 모든 열의 합집합을 반환하고 그 다음에 식을 실행합니까? 프로그램의 코드는 이고 프로그래밍은 입니다. x [y, foo boo]라고 쓰면 data.table이 자동으로 은 j 표현식을 검사하여 어떤 열을 사용하는지 확인합니다. 서브 세트는 이거나 그 컬럼 만 그룹화합니다. 메모리 은 j 이 사용하는 열에 대해서만 만들어집니다. foo가 x이고 boo 이 y에 있다고 가정 해 봅시다 (다른 20 개의 열 y와 함께). x [y, foo boo]가 프로그램에 더 빠르며 병합 단계와 다른 하위 집합 단계가 뒤 따르는 것이 더 빠릅니까?

나는 비슷한 문제를 해결했지만 this question을 알고 있지만 만족스럽게 해결되지 않은 것 같습니다. 누구든지 제가 누락되거나 오해 한 것을 압니까? 감사.

업데이트 : 데이터 테이블 도움말 메일 링리스트와 패키지 작성자 (Matthew Dowle) replied에 위의 FAQ를 잘못 입력했기 때문에 현재 사용하고있는 구문이 작동하지 않습니다. 즉 참조 할 수 없습니다. x[y,...] 일 때 j (즉 두 번째) 인수의 y 열.

+0

하지만 얼마 전 물어 보니 2011 년 2 월 CRAN에 v1.5.3이 릴리스되었습니다. NEWS, new? data.table 및 FAQ를 참조하십시오. –

+0

@Matthew, 네, 고맙습니다. 최신 릴리스에서 해결 된 사실을 알고 있습니다. 귀하가 여기서 지적 했으니 다행입니다. 그래서 다른 사람들에게는 분명합니다. –

답변

4

잘 이해하고 있는지 잘 모르겠다. 그리고 나는 또한 데이터의 문서를 읽기 시작했다.여기

> x[y,a*y] 
    foo boo 
[1,] 5 50 
[2,] 8 44 
[3,] 9 36 
[4,] 8 26 
[5,] 5 14 

, 당신이 얻을 : 당신이 Y의 열을 얻을 좋아하고 또한 의 열에 의해 사람들에게 무언가를한다면 테이블 라이브러리,하지만 난 당신이 뭔가를 시도 할 수 있습니다 생각 y에 열 x의 열을 곱합니다. 당신이 X 얻고 싶은 경우에의의를 foo는Y 곱 '의 영호 ... 영호, 시도 :

> y[,x*boo] 
    foo a 
[1,] 10 50 
[2,] 22 44 
[3,] 36 36 
[4,] 52 26 
[5,] 70 14 

편집 후 : 질문 명확하게 당신에게 @Prasad Chalasani 감사합니다 나를 위해.

간단한 병합을 선호하는 경우 다음이 작동해야합니다. 나는 행동 깊게 볼 수있는 더 복잡한 데이터를 만들어 :

x <- data.table(foo = 1:5, a=20:24, zoo = 5:1) 
y <- data.table(foo = 1:5, b=30:34, boo = 10:14) 
setkey(x, foo) 
setkey(y, foo) 

그래서 단지 여분의 열은 각 data.table에 추가되었습니다. 우리가 merge를 참조하자 data.tables으로 그 일 :

후자가 훨씬 더 빨리 보이는에서
> system.time(merge(x,y)) 
    user system elapsed 
    0.027 0.000 0.023 
> system.time(x[,list(y,x)]) 
    user system elapsed 
    0.003 0.000 0.006 

. 결과는하지만 동일하지 않은,하지만 (후자의 실행의 추가 컬럼) 같은 방법으로 사용할 수 있습니다

> merge(x,y) 
    foo a zoo b boo 
[1,] 1 20 5 30 10 
[2,] 2 21 4 31 11 
[3,] 3 22 3 32 12 
[4,] 4 23 2 33 13 
[5,] 5 24 1 34 14 
> x[,list(x,y)] 
    foo a zoo foo.1 b boo 
[1,] 1 20 5  1 30 10 
[2,] 2 21 4  2 31 11 
[3,] 3 22 3  3 32 12 
[4,] 4 23 2  4 33 13 
[5,] 5 24 1  5 34 14 

그래서 xy 우리가 사용할 수 있습니다 얻을 : xy <- x[,list(x,y)]. xy$foo * xy$boo에서 한 열 data.table을 계산하기 위해, 다음은 작동 할 수 있습니다 :

> xy[,foo*boo] 
[1] 10 22 36 52 70 

음, 결과는 data.table이 아니라 벡터 대신.


업데이트 (29/03/2012) : merge.data.table 위의 예에서 사용 된 사실 내 관심을 가리키는 @ 데이비드에 대한 감사합니다.

+0

내 질문에 예제를 참조하여, 나는'x'와'y'의 결합을하고,'xy'라고 부르며,'xy $ foo *와 같은 단일 컬럼 데이터 프레임을 만들고 싶습니다. xy $ boo'입니다. –

+0

@Prasad Chalasani : 내 대답을 편집 했으므로 새롭고 가치있는 것을 발견 할 수 있기를 바랍니다. – daroczig

+0

세부 사항에 대해 고마워요,하지만 내 질문에 왜 내 질문에 설명하는 특정 구문이 작동하지 않습니다, 그것에 대해 자주 묻는 질문에 대한 반대했다. 나는 두 단계 (병합 후 컬럼을 조작)로 할 수 있다는 것을 알고 있지만'x [y, ]'구문을 한 단계에서 * 처리하기를 원합니다. 즉, 조인을하고' x '와'y '열을 한 단계에서 처리합니다. 문법적으로 덜 지루하고, 더 빨리 (내부적으로 구현 된 경우) 더 빨라질 수 있습니다. 저는 1 천만 행의 데이터 프레임을 다루고 있으므로 위의 작은 장난감 예제의 타이밍에 관심이 없습니다. –

관련 문제