작성자: admin 작성일시: 2016-09-22 15:27:38 조회수: 122 다운로드: 19
카테고리: R 태그목록:

R 벡터와 행렬을 만들고 변형하기

벡터/행렬 생성

R에서 벡터와 행렬을 만들려면 원소를 일일히 c 명령이나 matrix 명령에 넣어야 했다. 하지만 모든 원소가 0 또는 1 등으로 같다면 다음과 같이 한 개의 값만 이용해서 벡터나 행렬을 만들 수도 있다.

In [1]:
a <- rep(0, 10)
a
  1. 0
  2. 0
  3. 0
  4. 0
  5. 0
  6. 0
  7. 0
  8. 0
  9. 0
  10. 0
In [2]:
a <- rep(1, 10)
a
  1. 1
  2. 1
  3. 1
  4. 1
  5. 1
  6. 1
  7. 1
  8. 1
  9. 1
  10. 1
In [3]:
b <- matrix(0, 3, 4)
b
0000
0000
0000
In [4]:
b <- matrix(1, 3, 4)
b
1111
1111
1111

특정한 규칙에 따라 증가하는 벡터는 seq 명령으로 만든다.

In [6]:
seq(1, 10)  # 1 .. n
  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10

seq 명령을 콜론(:) 기호로 대체할 수도 있다.

In [22]:
1:10
  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10

만약 1이 아닌 단계로 증가하게 하고 싶다면 세번째 인수를 추가한다.

In [10]:
seq(1, 11, 2)  # 시작, 끝(포함), 단계
  1. 1
  2. 3
  3. 5
  4. 7
  5. 9
  6. 11

단계가 아니라 갯수로 지정하려면 length 인수를 지정한다.

In [11]:
seq(0, 100, length=5)  # 시작, 끝(포함), 갯수
  1. 0
  2. 25
  3. 50
  4. 75
  5. 100

임의의 난수를 생성하고 싶다면 runif 혹은 rnorm 명령을 사용한다. runif 명령을 uniform 분포를 따르는 난수를 생성하고 rnorm 명령은 가우시안 정규 분포를 따르는 난수를 생성한다. 생성할 시드(seed)값을 지정하려면 set.seed 명령을 사용한다.

In [19]:
set.seed(0)
In [20]:
runif(4)
  1. 0.896697200136259
  2. 0.2655086631421
  3. 0.37212389963679
  4. 0.572853363351896
In [21]:
matrix(rnorm(15), c(3, 5))
1.3297993 -1.5399500 -0.005767173-0.7990092 -0.2992151
1.2724293 -0.9285670 2.404653389-1.1476570 -0.4115108
0.4146414 -0.2947204 0.763593461-0.2894616 0.2522234

배열의 크기 변형

일단 만들어진 배열의 내부 데이터는 보존한 채로 형태만 바꾸려면 dim 속성을 재설정 한다. 명령이나 메서드를 사용한다. 예를 들어 12개의 원소를 가진 1차원 행렬은 3x4 형태의 2차원 행렬로 만들 수 있다.

In [26]:
a <- 0:11
a
  1. 0
  2. 1
  3. 2
  4. 3
  5. 4
  6. 5
  7. 6
  8. 7
  9. 8
  10. 9
  11. 10
  12. 11
In [27]:
dim(a) <- c(3, 4)
a
0 3 6 9
1 4 7 10
2 5 8 11

이 행렬은 같은 방법으로 2x6 행렬로 바꿀 수도 있다.

In [28]:
dim(a) <- c(2, 6)
a
0 2 4 6 8 10
1 3 5 7 9 11

다차원 배열을 무조건 1차원으로 펼치기 위해서는 as.vector 명령을 사용한다.

In [29]:
as.vector(a)
  1. 0
  2. 1
  3. 2
  4. 3
  5. 4
  6. 5
  7. 6
  8. 7
  9. 8
  10. 9
  11. 10
  12. 11

벡터와 행렬 사용에서 주의할 점은 길이가 5인 1차원 배열과 행, 열의 갯수가 (5,1)인 2차원 배열 또는 행, 열의 갯수가 (1, 5)인 2차원 배열은 데이터가 같아도 엄연히 다른 객체라는 점이다.

In [30]:
x <- 0:4
x
  1. 0
  2. 1
  3. 2
  4. 3
  5. 4
In [34]:
matrix(0:4, c(1, 5))
01234
In [33]:
matrix(0:4, c(5, 1))
0
1
2
3
4

배열 연결

행의 수나 열의 수가 같은 두 개 이상의 배열을 연결하여(concatenate) 더 큰 배열을 만들 때는 다음과 같은 명령을 사용한다.

  • cbind
  • rbind
  • rep

cbind 명령은 행의 수가 같은 두 개 이상의 배열을 옆으로 연결하여 열의 수가 더 많은 배열을 만든다.

In [40]:
a1 <- matrix(1, 2, 3)
a1
111
111
In [41]:
a2 = matrix(0, 2, 2)
a2
00
00
In [42]:
cbind(a1, a2)
11100
11100

rbind 명령은 열의 수가 같은 두 개 이상의 배열을 위아래로 연결하여 행의 수가 더 많은 배열을 만든다.

In [43]:
b1 = matrix(1, 2, 3)
b1
111
111
In [44]:
b2 = matrix(0, 3, 3)
b2
000
000
000
In [45]:
rbind(b1, b2)
111
111
000
000
000

rep 명령은 동일한 벡터를 반복하여 연결한다.

In [56]:
a <- c(0, 1, 2)
In [57]:
rep(a, 4)
  1. 0
  2. 1
  3. 2
  4. 0
  5. 1
  6. 2
  7. 0
  8. 1
  9. 2
  10. 0
  11. 1
  12. 2
In [58]:
rep(a, each=4)
  1. 0
  2. 0
  3. 0
  4. 0
  5. 1
  6. 1
  7. 1
  8. 1
  9. 2
  10. 2
  11. 2
  12. 2

질문/덧글

아직 질문이나 덧글이 없습니다. 첫번째 글을 남겨주세요!