2011-08-13 9 views
4

행렬 (mat1)이 있습니다. 행 100 열 100 개가 있습니다. 모든 행이 루프를 사용하여이 작업을 수행 할행렬의 모든 행 바꾸기

내가 관리했습니다 (것을 제외하고 나는 원래 값으로 1 COL을 유지하려는) MAT1에서 1 행과 동일 어디 다른 매트릭스를 만들려면 :

mat2 <- mat1 

for(i in 1:nrow(mat1)) 
{ 
    mat2[i,2:ncol(mat2)] <- mat1[1,2:ncol(mat1)] 
} 

이 작동하고 내가 예상 한 결과를 생성합니다; 그러나, 나는 루프없이 그것을 할 수있는 방법이 있어야한다고 생각했을 것이다; 나는 시도했다 :

mat2 <- mat1 
mat2[c(2:100),2:ncol(mat2)] <- mat1[1,2:ncol(mat1)] 

누군가 내 오류를 지적 할 수있다?!

감사합니다,
크리스

답변

7

문제는 R이 열을 기준으로, 행렬을 채우는 방법입니다보십시오. 다음은이 도시를 간단한 예이다

mat1 <- matrix(1:9, ncol = 3) 
mat2 <- matrix(1:9, ncol = 3) 

mat2[-1, -1] <- mat1[1, -1] 
mat2 

> mat2 
    [,1] [,2] [,3] 
[1,] 1 4 7 
[2,] 2 4 4 
[3,] 3 7 7 

mat1[1, -1]는 R이 mat2 열 방향의 비트를 채우기 위해 사용되는 것을 볼 수 4,7 벡터이다. 당신은 연속적인 작업을 원했습니다. 필요로

하나의 솔루션으로 교체 벡터를 여러 번 복제하는 것입니다 :

> mat2[-1, -1] <- rep(mat1[1, -1], each = nrow(mat1)-1) 
> mat2 
    [,1] [,2] [,3] 
[1,] 1 4 7 
[2,] 2 4 7 
[3,] 3 4 7 

우리가 "each" 인수를 사용할 때 rep() 전화 대신 복제하는 벡터의 각 값을 복제하기 때문에 작동 (반복) 벡터 :

:

> rep(mat1[1, -1], each = nrow(mat1)-1) 
[1] 4 4 7 7 

기본 동작은 또한 잘못된 대답을 줄 것이다

일부 문제는 R이 인수를 대체 할 적절한 길이로 확장하는 방법이기도합니다. R은 사실상 자동으로 rep(mat1[1, -1], nrow(mat1)-1)과 같은 방식으로 교체 벡터를 확장했습니다. 이는 fill-by-column 원리와 결합하여 본 행동을 나타냅니다.

1

mat2[c(2:nrow(mat2)), 2:ncol(mat2)] <- mat1[rep.int(1,nrow(mat1)-1),2:ncol(mat1)] 
1

또 다른 옵션 ...

n = 5 
mat1 = matrix(sample(n^2, n^2), n, n) 

# use matrix with byrow to copy 1st row n times 
mat2 = matrix(rep(mat1[1, ], n), n, n, byrow = TRUE) 

# copy 1st column 
mat2[ , 1] = mat1[ , 1] 

mat1 
mat2