2012-11-09 2 views
3

특정 tak의 데이터 테이블과의 효율적인 교차 결합이 가능한지 궁금합니다.crossproduct/join with data.table with function

벡터의 모든 숫자를 다른 모든 숫자와 비교하는 벡터화 된 버전이 있다고 가정 해 보겠습니다. 내가 잘못 아니에요 경우, R에서의 벡터화 버전

somevector <- rnorm(10, 5) 
sapply(somevector, function(x) { 
    return(x-somevector) 
}) 

은 data.table와 같은 매트릭스를 생성하는 것이 가능 있을까요? 효율적일까요?

감사합니다.

+1

귀하의 질문에 대한 답변이 아니지만 귀하의 접근 방식보다 빠른 '외부 (somevector, somevector,'- ')'를 사용할 수 있습니다. – Roland

+0

예, 감사합니다. 나는 당신의 스 니펫을 실행하지만 더 빠른 결과를 얻지 못한다. 'somevector <- rnorm (10000, 5) system.time (sapply (somevector, function (x) {return (x-somevector)})) system.time (outer (somevector, somevector, '-'))' – Drey

+0

내 시스템에서'outer'는 2 배 더 빠릅니다. RAM이 부족하여 병 목을 디스크에 쓰면 속도가 빨라질 수 있습니다. 'data.table'는 인상적인 마술을하지만,이 작업을 빠르게 할 수 있는지 확신 할 수 없습니다. 기억 문제에 도움이 될지 모르지만. – Roland

답변

0

expand.grid SQL에서 교차 결합이라고하는 것은 무엇입니까? 이 벡터를 사용하여 두 벡터를 쉽게 뺄 수 있습니다.

x<-1:7 
somevector <- rnorm(10, 5) 
df<-(expand.grid(x,somevector)) 
df[,1]-df[,2] 
+1

확장 그리드에 대해 몰랐습니다. 감사합니다. 벡터를 생성하지만 런타임은'sapply' 및'outer'보다 여전히 더 나쁩니다. 그리고 저는 여기서 기억이 문제라고 생각합니다. 나는 20k 희미한 벡터로'expand.grid'를 시도했고 메모리가 꽤 빨리 소모되었습니다. – Drey