2013-06-16 4 views
3

큰 데이터 프레임 (40000 개의 변수를 40000 개 관측)을 가지고 있으며 모든 점의 열 범위에 대해 제품과 비슷한 점으로 작업하고 싶습니다. 이것이 내가 구현 한 방법입니다 :R- ddply를 사용하여 데이터 프레임의 열 하위 집합에서 작업

matrixattempt <- as.matrix(dframe) 
takerow <- function(k) {as.vector(matrixattempt[k,])} 
takedot0 <- function(k) {sqrt(sum(data0averrow * takerow(k)[2:785]))} 

for (k in 1:40000){ 
print(k) 
dframe$dot0aver[k]<-takedot0(k) 
} 

인쇄물은 무슨 일이 일어나고 있는지 추적하기위한 것입니다. data0averrow은 사전 정의 된 takerow (k) [2 : 785]과 동일한 크기의 숫자 벡터입니다.

이 테스트는 실행 중이며 올바르게 실행중인 몇 가지 테스트에서 발생하지만 매우 느립니다.

열의 하위 집합에 대해 내적을 검색했지만 this question이 발견되었지만 설정에 적용하는 방법을 파악할 수 없었습니다. ddply는 더 빨리 작동해야하는 것처럼 들리지만 (비록 내가 분할하고 싶지 않고 참조 된 질문자와 동일한 정의 -id 트릭을 사용해야 만합니다). 모든 통찰력/힌트? 결과에

+1

이러한 답 중 어느 것도 작동하지 않는다면 작은 테스트 케이스에 문제가 생길 수 있습니다. 예를 들어 8 x 10 매트릭스입니까? –

+0

@ Arun의 응답이 잘 작동했습니다. 고맙습니다. – zdilli

답변

2

이 시도 범위의 각 행에 data0aver의 내적의 SQRT이다 또는 동등하게 :

sqrt(matrixattempt[, 2:785] %*% data0averrow) 
+0

두 가지 모두 꽤 빠르게 작동했습니다. 고맙습니다. for 루프를 작성하기 전에 % * %로 행을 시도했으나 순서가 바뀌거나 (또는 ​​다른 설정이 잘못되어서) 모든 행에 대해 동일한 값을 제공하게되었습니다. – zdilli

2

사용 행렬 곱셈과 rowSums는 :

sqrt(colSums(t(matrixattempt[, 2:785]) * data0averrow)) 

:

dframe$dot0aver <- NA 
dframe$dot0aver[2:785] <- sqrt(rowSums( 
           matrixattempt[2:785,] %*% data0averrow)) 

+0

확실하지는 않지만 RHS는'matrixattempt [, 2 : 785] % * % ...'여야한다고 생각합니까? 그리고 여러분은'rowSums'가 필요 없다고 생각합니다. – Arun

+0

확실하지 않습니다. 나는 행 2 : 785에 열의 수와 같은 길이의 벡터를 곱하기를 원한다고 생각했습니다. 나는 나의 첫 번째 시도가 오류 또는 두 –

+0

아 있었기 때문에 그것을 반영하기 위해 내 대답을 편집 지금 당신이 무슨 뜻인지 왜 당신은 rowSums가 필요 참조하십시오. 그러나 내가 본 것은 : 각 k에 대해,''matrixattempt'의 k 번째 행을'2 : 785' 열로 가져 와서 'data0averrow'로 곱하면됩니다. – Arun

관련 문제