獨斷論

통계 R 사용설명서 4 - 데이터 형태 벡터 행렬 배열 본문

과학과 기술/R 통계

통계 R 사용설명서 4 - 데이터 형태 벡터 행렬 배열

부르칸 2016. 2. 9. 01:48

R에서 사용되는 데이터형으로는 벡터(vector), 행렬(matrix), 배열(array), 데이터프레임(data frame), 리스트(list), 인자(factor) 등이 있다. 스칼라라고 그냥 쓰이는 일반적인 하나의 숫자도 있기는 하지만 쉬운거니깐 생략,, a <- 1이라고 하면 이게 바로 스칼라. 가장 많이 쓰이고 중요하는 형태는 데이터프레임이므로 잘 기억해두자. 인자 형은 나중에 ANOVA 등에 자주 쓰인다.


1. 벡터, vector


데이터가 1행 또는 1열로 들어가 있는 데이터 형태를 말하며 그 원소로는 숫자, 문자, 논리값 등이 가능하다.

예를 들면


1

2

3

 > a <- c(1, 2, 3, 4, 5.1)
 > b <- c("one", "two", "three", "four", "five")
 > c <- c(TRUE, TRUE, TRUE, TRUE, FALSE)


a는 숫자벡터, b는 문자벡터, c는 논리벡터인데 중요한 것은 벡터의 원소값들은 모두 같은 형태의 것만 들어가야 한다는것이다.

만약에 숫자와 문자를 같이 벡터에 넣으면 어떻게 될까?


1

2

3

4

5

 > d <- c(1, 2, "one")
 > d
 [1] "1"   "2"   "one"
 > class(d)
 [1] "character"


위에서 보는 바와 같이 벡터 d는 문자벡터가 되어 1과 2는 더이상 숫자가 아니라 문자가 된다.


벡터 안에 각각의 값을 이용하려면 대괄호를 사용한다.


1

2

3

4

5

6

 > a[3]
 > a[5]
 > asum <- a[3] + a[5]
 > asum
 > a[c(1, 3, 5)]
 > a[3:5]



2. 행렬, matrix


행렬 데이터 입력

데이터가 행과 열로 들어가 있는 것이다. 따라서 2차원이 된다. 벡터와 마찬가지로 한 가지 형태의 데이터만 존재해야만 한다. 벡터는 c()라는 함수를 이용했는데 행렬은 matrix()라는 함수를 이용한다. 


1

2

3

4

5

6

 > y <- matrix(1:15, nrow = 3, ncol = 5, byrow = FALSE)
 > y
      [,1] [,2] [,3] [,4] [,5]
 [1,]    1    4    7   10   13
 [2,]    2    5    8   11   14
 [3,]    3    6    9   12   15


1번 줄에 matrix()함수를 사용하여 y에 행렬을 만들었다.

matrix()함수의 첫번째 인자는 행렬을 만들고자하는 숫자들의 값이다. nrow는 행의 갯수이고 ncol은 열의 갯수를 나타낸다. 둘 중 하나는 생략해도 무방하다. 전체 원소가 15개이므로 nrow=5만 지정하고 ncol은 생략하고 다음 명령을 실행해보자.


1

2

3

4

5

6

7

8

 > y <- matrix(1:15, nrow = 5, byrow = FALSE)
 > y
      [,1] [,2] [,3]
 [1,]    1    6   11
 [2,]    2    7   12
 [3,]    3    8   13
 [4,]    4    9   14
 [5,]    5   10   15


위와 같이 행이 5개인 행렬이 만들어졌다.


또 중요한 것은 1:15의 값들이 기본적으로 열방향의 순서로 들어간다는 것이다.

즉, byrow=FALSE를 생략하더라도 같은 결과가 나온다.


1

2

3

4

5

6

7

8

 > y <- matrix(1:15, nrow = 5)
 > y
      [,1] [,2] [,3]
 [1,]    1    6   11
 [2,]    2    7   12
 [3,]    3    8   13
 [4,]    4    9   14
 [5,]    5   10   15


만약 데이터를 행방향으로 넣고싶다면 다음과 같이 byrow=TRUE를 입력하면 된다.


1

2

3

4

5

6

7

8

 > y <- matrix(1:15, nrow = 5, byrow = TRUE)
 > y
      [,1] [,2] [,3]
 [1,]    1    2    3
 [2,]    4    5    6
 [3,]    7    8    9
 [4,]   10   11   12
 [5,]   13   14   15


일반적으로 가지고 있는 변수를 행렬에 넣고자 할때 다음과 같이 한다.

즉 가지고 있는 데이터를 난수로 가정해본다면


1

2

3

4

5

6

7

8

 > mrandv <- runif(20)
 > z <- matrix(mrandv, nrow = 4, byrow = FALSE)
 > z
            [,1]      [,2]       [,3]      [,4]      [,5]
 [1,] 0.86842334 0.1392664 0.60759721 0.1696775 0.0799099
 [2,] 0.21059372 0.2884365 0.39391748 0.9391732 0.9923162
 [3,] 0.07629591 0.3847023 0.03573402 0.5044928 0.2055946
 [4,] 0.69695063 0.5077960 0.11536241 0.3938360 0.5048006


난수발생은 실행할때마다 다르므로 위 숫자는 달라질수 있다. 


행렬 데이터의 이용 또는 참조

우선 x4x5짜리 행렬을 만들어 원소를 넣는다


1

2

3

4

5

6

7

8

9

10

11

12

13

 > x <- matrix(1:20, nrow=4)
 > x
      [,1] [,2] [,3] [,4] [,5]
 [1,]    1    5    9   13   17
 [2,]    2    6   10   14   18
 [3,]    3    7   11   15   19
 [4,]    4    8   12   16   20
 > x[2, ]
 [1]  2  6 10 14 18
 > x[, 4]
 [1] 13 14 15 16
 > x[2, c(1, 4)]
 [1]  2 14


위 8번줄의 명령어는 x의 2번째 행 모두를 가져오는 것이다.

위 10번줄의 명령어는 x의 4번재 열 모두를 가져오는 것이다.

2행의 1번열과 2행의 4번열 즉 x의 (2,1)과 (2,4)를 가져오는 명령어는 12번줄의 명령어로 해결하면 된다.



3. 배열, array


배열의 행렬과 비슷한데 행렬이 2차원이라면 배열은 3차원 이상이다.


배열 데이터 입력

배열에 데이터를 입력하기 위해서 array()라는 함수를 이용한다. 사용하는 방법은 matrix()함수와 비슷하게 처음 인자로 데이터 벡터를 사용하고 두번째 인자로는 각 차원의 숫자를 사용한다.  즉 2x3x4의 배열을 만들고자 한다면 다음과 같이 한다.

A <- array(data_vector, c(2,3,4))

예를 들어보면


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

 > data_vector <- c(1:24)
 > A <- array(data_vector, c(2,3,4))
 > A
 , , 1
 
      [,1] [,2] [,3]
 [1,]    1    3    5
 [2,]    2    4    6
 
 , , 2
 
      [,1] [,2] [,3]
 [1,]    7    9   11
 [2,]    8   10   12
 
 , , 3
 
      [,1] [,2] [,3]
 [1,]   13   15   17
 [2,]   14   16   18
 
 , , 4
 
      [,1] [,2] [,3]
 [1,]   19   21   23
 [2,]   20   22   24


1번줄에서 data_vector에 1부터 24까지 값을 넣은 벡터를 만들고

이것을 2번줄에서 array()함수를 이용하여 2x3x4의 배열로 만들었다. 즉 2x3짜리 행렬이 4개 만들어진것이다. 2x3짜리 첫번째 행렬은 위 6, 7, 8번째 줄에 나타나 있고 2x3짜리 두번째 행렬은 12, 13, 14번째 줄에 나타나있다. ......

숫자만 나열해서 알아보기 어렵다면 각 차원별로 그리고 각 행과 열 별로 이름을 부여하는 것도 좋은 방법이다. 이때 dimnames라는 것을 이용하면 된다. dimnames는 나중에 설명할 list라는 데이터 형을 취하고 있다.


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

 > d1 <- c("X1", "X2")
 > d2 <- c("Y1", "Y2", "Y3")
 > d3 <- c("Z1", "Z2", "Z3", "Z4")
 > data_vector <- c(1:24)
 > A <- array(data_vector, c(2,3,4), dimnames = list(d1, d2, d3))
 > A
 , , Z1
 
    Y1 Y2 Y3
 X1  1  3  5
 X2  2  4  6

 , , Z2
 
    Y1 Y2 Y3
 X1  7  9 11
 X2  8 10 12
 
 , , Z3

    Y1 Y2 Y3
 X1 13 15 17
 X2 14 16 18
 
 , , Z4
 
    Y1 Y2 Y3
 X1 19 21 23
 X2 20 22 24


1번째 줄에서 첫번째 차원의 각 행의 이름을 X1과 X2라고 정하였고

2번째 줄에서 두번째 차원의 각 열의 이름을 Y1, Y2, Y3라 정하였고

3번째 줄에서 세번째 차원의 이름을 Z1, Z2, Z3, Z4라고 정하였다.

5번째 줄에서 이들 차원의 각각의 이름들을 dimnames = list(d1, d2, d3)라고 지정하여 주었다.

이렇게 하면 앞서 숫자로만 각 차원의 이름이 나온것보다는 알아보기 쉬을 것이니 눈이 모니터가 뚫어져라 쳐다보면 이해될 것이다. 


배열 데이터 이용

행렬과 똑같이 대괄호를 사용한다.


1

2

3

4

5

6

7

8

9

 > A[1,1,1]
 [1] 1
 > A[1,3,1]
 [1] 5
 > A[1,,]
    Z1 Z2 Z3 Z4
 Y1  1  7 13 19
 Y2  3  9 15 21
 Y3  5 11 17 23


1번줄은 쉬는것이고 3번줄은 X1, Y3, Z1의 데이터를 가져온 것이다.

5번줄은 X1에 해당되는 모든 데이터를 가져온 것이다. A의 데이터를 차근차근 살펴보고 X1에 해당되는 값을 열방향으로 차례로 넣은 것이라고 생각하면 쉽다.

이를 더 응용하면 다음과 같은것도 가능하다.


1

2

3

4

5

 > A[1,,][2,2]
 [1] 9
 > A[1,,][2,c(1,3)]
 Z1 Z3
  3 15


A[1,,]의 결과도 하나의 행렬이므로 이 결과로부터 다시 2행 2열을 불러오면 그 값은 9가 된다.

또한 A[1,,]의 행렬에서 2행의 1열과 2행의 3열을 가져올수도 있다. 이는 3번줄에 실행하였다.


한꺼번에 너무 많이 하면 체하니깐 데이터프레임과 리스트 인자 들은 나중에....

Comments