2011-05-06 6 views
2

저는이 방법으로 64 * 25 행렬로 변환하고자하는 320 * 25 행렬을 가지고 있습니다 : 새로운 행렬의 각 행은 이전의 5 행의 평균을 가져야합니다 하나 (그리고 나서 그들은 유사한 방식으로 특정 벡터에 의해 표준화 될 것입니다). ,행렬을 부분 평균으로 변환하기

for (x in c(1:64)){ 

     helping.matrix[x,] = colSums(original.matrix[((5*(x-1)+1):5*x),])/sum(vector[((5*(x- 1)+1):5*x)]) 

} 

불행하게도이 작동하지 않은 다음과 같은 오류 반환 : 당신은 내가이 구현하기 위해 노력했습니다 방법을 볼 수 있습니다 아래의

Error in inherits(x, "data.frame") : subscript out of bounds

답변

2

글쎄,이 그것을 할 수 - 당신이있는 경우 NA가없는 숫자 값 : ...

m <- matrix(runif(320*25),320) 
k <- 5 
m2 <- rowsum(m, rep(seq(nrow(m)/k), each=k))/k 
+0

원래 생각했던 것보다 간단합니다! – DonC

3

여기에 함축적 인 방법으로 여러 가지 문제가 있습니다. 첫째, 재현의 예를 확인하는 데 도움이 : 당신이에 대한 루프를 사용하려는 경우

original.matrix <- matrix(1:(320*25), nrow=320, ncol=25) 

둘째, 당신은 결과를 유지하기 위해 객체를 초기화해야합니다

helping.matrix <- matrix(nrow=64, ncol=25) 

확인을, 이제 코드를 살펴 보겠습니다.

for (x in c(1:64)){ 
helping.matrix[x,] = colSums(original.matrix[((5*(x-1)+1):5*x),])/ 

여기의 색인 표현은 꽤 야생이며 원하는 것을 수행하지 않습니다. 예를 들어, x = 2 인 경우 (5*(x-1)+1):5*x = 12, 10. 이는 명시된 목표와 일치하지 않습니다. x = 9에서 expression은 original.matrix의 행 수보다 큰 값을 반환하기 때문에 "범위를 벗어났습니다"라는 오류가 발생합니다. 우리가 데이터 개체 인 것처럼 당신이 인덱스 vector하려고하는 다음

vector[((5*(x-1)+1):5*x)]) 

에 도착하면 다음 문제가 occures. 그러나 벡터는 데이터 객체가 아니라 함수입니다. 어쩌면 c((5*(x-1)+1):5*x)을 원 하시겠습니까? 어쨌든이 섹슨 코드가 의도하는 바가 정확히 무엇인지 명확하지 않으므로 여기서 제안을 많이 제공 할 수는 없습니다.

좋아, 이제 시작하자. 오버 반복하는 루프 또는 적용 - 가족 기능을 사용

groups <- rep(1:(320/5), each=5) 

다음 :이 문제에 접근 할 방법은 당신이 당신의 합산 기능을 적용 할 그룹에 매핑하는 인덱스 벡터를 만드는 것입니다 여러 떼. 에 대한 루프 방식은

helping.matrix <- matrix(nrow=64, ncol=25) 
for(i in unique(groups)) { 
helping.matrix[i,] <- colSums(original.matrix[groups == i,]) 
} 

처럼 보일 것이다 나는 "특정 벡터에 의해 표준화"에 예상되는 부분을 왼쪽으로 한

helping.matrix <- Reduce(rbind, by(original.matrix, groups, colSums)) 

같이 적용 기반의 접근 방식이 보일 것이다 실제로 일어날 일이 무엇인지 분명하지 않기 때문입니다.

+0

철저한 분석을 위해 +1! – Tommy

+0

나는 helpin.matrix를 이미 정의했다. 색인을 생성 할 때 나는 이것을하려고했습니다 : 예를 들어 x = 1의 경우, 5 * (1-1) + 1 = 1, 5 * x = 1 그래서'whom.matrix [1,] = colSums (original 내가 그것을 돕기를 원한다고 기대했다. [1,] = colSums (original.matrix [(1 : 1) 5 :])'(행렬의 행 1 ~ 5)':'는 나눗셈을 의미하는 것이 아니라 벡터와 동일하다.두 번째 - 마지막 코드는 제가 처음에 가졌던 코드였습니다! 감사합니다 – DonC

+0

@DonC 음'(5 * (x-1) +1) : 5 * x'는 x = 1에 대해 작동합니다. 그러나 그것이 작동하는 x의 유일한 가치입니다. (5 * (x-1) +1) : 5 * x, "for (x in c (1:10)) {cat (paste ("x = ", x" \ n ")}'. 그리고 예, 색인 생성은 벡터로 작동하지만 '벡터'기능으로는 작동하지 않습니다. 예를 들어'c (1:10) [1]'은 완벽하게 적당하지만'vector [1]'은 그렇지 않다. (vector라는 이름의 벡터를 저장하지 않았다면,'install.packages ("fortunes"), 도서관 (행운), 행운 ("개")'). – Ista