[R프로그래밍] 매트릭스, 데이터프레임

·2021년 10월 18일
0

[R프로그래밍]

목록 보기
3/7

📌 매트릭스

1차원 데이터 : '몸무게' 같은 단일 주제의 데이터는 벡터
2차원 데이터 : '키','몸무게','나이'와 같은 여러 주제의 데이터는 매트릭스, 데이터 프레임

매트릭스 : 데이터 테이블의 모든 셀의 값들이 동일한 자료형
데이터
데이터 프레임 : 자료형이 다른 칼럼들로 구성

📖 매트릭스에서의 값 추출

✔ 기본적인 매트릭스 만들기

2차원 테이블 형태의 자료구조로, 매트릭스의 모든 셀에 저장되는 값은 동일한 자료형 이어야함

z <- matrix(1:20, nrow=4, ncol=5) //nrow:행의 수, ncol:열의 수
z
     [,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

✔ 매트릭스에 저장될 값들을 행 방향으로 채우기

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

✔ 기존 매트릭스에 벡터를 추가하여 새로운 매트릭스 만들기

> x <- 1:4 #벡터 x 생성
> y <- 5:8 #벡터 y 생성
> z <- matrix(1:20, nrow=4, ncol=5) #매트릭스 z 생성

> m1 <- cbind(x,y) #x와 y를  방향으로 결합하여 매트릭스 생성
> m1
     x y
[1,] 1 5
[2,] 2 6
[3,] 3 7
[4,] 4 8

> m2 <- rbind(x,y) #x와 y를  방향으로 결합하여 매트릭스 생성
> m2
  [,1] [,2] [,3] [,4]
x    1    2    3    4
y    5    6    7    8

> m3 <- rbind(m2,x) #매트릭스 m2와 벡터 x를  방향으로 결합
> m3
  [,1] [,2] [,3] [,4]
x    1    2    3    4
y    5    6    7    8
x    1    2    3    4

> m4 <- cbind(z,x) #매트릭스 z와 벡터 x를  방향으로 결합
> m4
                  x
[1,] 1 5  9 13 17 1
[2,] 2 6 10 14 18 2
[3,] 3 7 11 15 19 3
[4,] 4 8 12 16 20 4

📖 매트릭스에서의 값 추출

✔ 인덱스값을 이용하여 매트릭스에서의 값 추출하기

매트릭스에서 특정 위치에 있는 값을 추출하는 방법은 벡터와 유사
값들의 위치를 나타내는 인덱스를 사용하는데, 2차원상에서 위치를 지정하려면 2개 필요

> z <- matrix(1:20, nrow=4, ncol=5) 
> z
     [,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

> z[2,3] #2행 3열에 있는 값
[1] 10

> z[1,4] #1행 4열에 있는 값
[1] 13

> z[2,] #2행에 있는 모든 값
[1]  2  6 10 14 18

> z[,4] #4열에 있는 모든 값
[1] 13 14 15 16

✔ 매드릭스에서 여러 개의 값을 동시에 추출하기

> z <- matrix(1:20, nrow=4, ncol=5)
> z
     [,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

> z[2,1:3] #2행의 값 중 1~3열에 있는 값
[1]  2  6 10

> z[1,c(1,2,4)] #1행의 값 중 1,2,4열에 있는 값
[1]  1  5 13

> z[1:2,] #1,2행에 있는 모든 값
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    5    9   13   17
[2,]    2    6   10   14   18

> z[,c(1,4)] #1,4열에 있는 모든 값
     [,1] [,2]
[1,]    1   13
[2,]    2   14
[3,]    3   15
[4,]    4   16

📖 매트릭스의 행과 열에 이름 지정

✔ 매트릭스의 행과 열에 이름 지정하는 법

> score <- matrix(c(90,85,69,78,
+                   85,96,49,95,
+                   90,80,70,60),
+                 nrow=4, ncol=3)
> score
     [,1] [,2] [,3]
[1,]   90   85   90
[2,]   85   96   80
[3,]   69   49   70
[4,]   78   95   60

> rownames(score) <- c('john','tom','mark','jane') #행 이름

> colnames(score) <- c('english','math','science') #열 이름

> score
     english math science
john      90   85      90
tom       85   96      80
mark      69   49      70
jane      78   95      60

✔ 행과 열에 지정한 이름을 이용하여 매트릭스 값 추출하기

> score['john','math'] #john의 수학 성적
[1] 85

> score['tom',c('math','science')] #tom의 수학, 과학 성적
   math science 
     96      80 
     
> score['mark',] #mark의 모든 과목 성적
english    math science 
     69      49      70 
     
> score[,'english'] #모든 학생의 영어 성적
john  tom mark jane 
  90   85   69   78 
  
> rownames(score) #score의 행 이름
[1] "john" "tom"  "mark" "jane"

> colnames(score) #score의 열 이름
[1] "english" "math"    "science"

> colnames(score)[2] #score의 열 이름 중 두 번째 값
[1] "math"

📌 데이터프레임

  • 숫자형 벡터, 문자형 벡터 등 서로 다른 형태의 데이터를 2차원 데이터 테이블 형태로 묶을 수 있는 자료구조
  • 외관상으로는 매트릭스와 차이가 없지만 매트릭스에 저장되는 모든 값들이 동일한 자료형인 것과는 달리 데이터 프레임에는 서로 다른 자료형의 값들이 함께 저장
    ex) '키','몸무게','성별'의 데이터

✔ 데이터 프레임 만들기

> city <- c("seoul","tokyo","washington") #문자로 이루어진 벡터
> rank <- c(1,3,2) #숫자로 이루어진 벡터

> city.info <- data.frame(city, rank) #데이터 프레임 생성
> city.info
        city rank
1      seoul    1
2      tokyo    3
3 washington    2

✔ iris 데이터셋

  • R에서 제공하는 실습용 데이터셋중의 하나로 데이터 프레임으로 되어 있음
  • 150그루의 붓꽃에 대해 4개 분야의 측정 데이터와 품종 정보를 결합하여 만든 데이터셋

Sepal.Length : 꽃받침의 길이 (숫자형)
Sepal.Width : 꽃받침의 폭 (숫자형)
Petal.Length : 꽃잎의 길이 (숫자형)
Petal.Width : 꽃잎의 폭 (숫자형)
Species : 붓꽃의 품종 (문자형(팩터))

iris[,c(1:2)] #1,2열의 모든 데이터

iris[,c(1,3,5)] #1,3,5열의 모든 데이터

iris[,c("Sepal.Length","Species")] #1,5열의 모든 데이터

iris[1:5,] #1~5행의 모든 데이터

iris[1:5,c(1,3)] #1~5행의 데이터 중 1,3열의 데이터

📌 매트릭스와 데이터프레임

📖 데이터셋의 기본 정보 확인

✔ iris 데이터셋의 기본 내용 확인

  • 매트릭스와 데이터 프레임은 모두 2차원 형태의 데이터를 저장하는 자료구조이기 때문에 다루는 방법이 대부분 동일
  • 데이터 프레임인 iris 데이터셋을 대상으로 학습하지만, 매트릭스에도 동일하게 적용
> dim(iris) #행과 열의 개수 출력
[1] 150   5

> nrow(iris) #행의 개수 출력
[1] 150

> ncol(iris) #열의 개수 출력
[1] 5

> colnames(iris) #열 이름 출력, names()와 결과 동일
[1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width" 
[5] "Species"     

> head(iris) #데이터셋의 앞부분 일부 출력
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa

> tail(iris) #데이터셋의 뒷부분 일부 출력
    Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
145          6.7         3.3          5.7         2.5 virginica
146          6.7         3.0          5.2         2.3 virginica
147          6.3         2.5          5.0         1.9 virginica
148          6.5         3.0          5.2         2.0 virginica
149          6.2         3.4          5.4         2.3 virginica
150          5.9         3.0          5.1         1.8 virginica

✔ iris 데이터셋의 추가적인 내용 확인

> str(iris) #데이터셋 요약 정보
'data.frame':	150 obs. of  5 variables:
 $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
 $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
 $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
 $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
 $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
 
 > iris[,5] #품종 데이터 보기
  [1] setosa     setosa     setosa     setosa     setosa     setosa    
  [7] setosa     setosa     setosa     setosa     setosa     setosa    
 [13] setosa     setosa     setosa     setosa     setosa     setosa    
 [19] setosa     setosa     setosa     setosa     setosa     setosa    
 [25] setosa     setosa     setosa     setosa     setosa     setosa    
 [31] setosa     setosa     setosa     setosa     setosa     setosa    
 [37] setosa     setosa     setosa     setosa     setosa     setosa    
 [43] setosa     setosa     setosa     setosa     setosa     setosa    
 [49] setosa     setosa     versicolor versicolor versicolor versicolor
 [55] versicolor versicolor versicolor versicolor versicolor versicolor
 [61] versicolor versicolor versicolor versicolor versicolor versicolor
 [67] versicolor versicolor versicolor versicolor versicolor versicolor
 [73] versicolor versicolor versicolor versicolor versicolor versicolor
 [79] versicolor versicolor versicolor versicolor versicolor versicolor
 [85] versicolor versicolor versicolor versicolor versicolor versicolor
 [91] versicolor versicolor versicolor versicolor versicolor versicolor
 [97] versicolor versicolor versicolor versicolor virginica  virginica 
[103] virginica  virginica  virginica  virginica  virginica  virginica 
[109] virginica  virginica  virginica  virginica  virginica  virginica 
[115] virginica  virginica  virginica  virginica  virginica  virginica 
[121] virginica  virginica  virginica  virginica  virginica  virginica 
[127] virginica  virginica  virginica  virginica  virginica  virginica 
[133] virginica  virginica  virginica  virginica  virginica  virginica 
[139] virginica  virginica  virginica  virginica  virginica  virginica 
[145] virginica  virginica  virginica  virginica  virginica  virginica 
Levels: setosa versicolor virginica

> unique(iris[,5]) #품종 종류 보기 (중복 제거)
[1] setosa     versicolor virginica 
Levels: setosa versicolor virginica

> table(iris[,"Species"]) #품종의 종류별 행의 개수 세기

    setosa versicolor  virginica 
        50         50         50 

📖 매트릭스와 데이터프레임에서 사용하는 함수

✔ 행별, 열별 합계와 평균 계산

> colSums(iris[,-5]) #열별 합계
Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
       876.5        458.6        563.7        179.9 
       
> colMeans(iris[,-5]) #열별 평균
Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
    5.843333     3.057333     3.758000     1.199333 
    
> rowSums(iris[,-5]) #행별 합계
  [1] 10.2  9.5  9.4  9.4 10.2 11.4  9.7 10.1  8.9  9.6 10.8 10.0  9.3
 [14]  8.5 11.2 12.0 11.0 10.3 11.5 10.7 10.7 10.7  9.4 10.6 10.3  9.8
 [27] 10.4 10.4 10.2  9.7  9.7 10.7 10.9 11.3  9.7  9.6 10.5 10.0  8.9
 [40] 10.2 10.1  8.4  9.1 10.7 11.2  9.5 10.7  9.4 10.7  9.9 16.3 15.6
 [53] 16.4 13.1 15.4 14.3 15.9 11.6 15.4 13.2 11.5 14.6 13.2 15.1 13.4
 [66] 15.6 14.6 13.6 14.4 13.1 15.7 14.2 15.2 14.8 14.9 15.4 15.8 16.4
 [79] 14.9 12.8 12.8 12.6 13.6 15.4 14.4 15.5 16.0 14.3 14.0 13.3 13.7
 [92] 15.1 13.6 11.6 13.8 14.1 14.1 14.7 11.7 13.9 18.1 15.5 18.1 16.6
[105] 17.5 19.3 13.6 18.3 16.8 19.4 16.8 16.3 17.4 15.2 16.1 17.2 16.8
[118] 20.4 19.5 14.7 18.1 15.3 19.2 15.7 17.8 18.2 15.6 15.8 16.9 17.6
[131] 18.2 20.1 17.0 15.7 15.7 19.1 17.7 16.8 15.6 17.5 17.8 17.4 15.5
[144] 18.2 18.2 17.2 15.7 16.7 17.3 15.8

> rowMeans(iris[,-5]) #행별 평균
  [1] 2.550 2.375 2.350 2.350 2.550 2.850 2.425 2.525 2.225 2.400 2.700
 [12] 2.500 2.325 2.125 2.800 3.000 2.750 2.575 2.875 2.675 2.675 2.675
 [23] 2.350 2.650 2.575 2.450 2.600 2.600 2.550 2.425 2.425 2.675 2.725
 [34] 2.825 2.425 2.400 2.625 2.500 2.225 2.550 2.525 2.100 2.275 2.675
 [45] 2.800 2.375 2.675 2.350 2.675 2.475 4.075 3.900 4.100 3.275 3.850
 [56] 3.575 3.975 2.900 3.850 3.300 2.875 3.650 3.300 3.775 3.350 3.900
 [67] 3.650 3.400 3.600 3.275 3.925 3.550 3.800 3.700 3.725 3.850 3.950
 [78] 4.100 3.725 3.200 3.200 3.150 3.400 3.850 3.600 3.875 4.000 3.575
 [89] 3.500 3.325 3.425 3.775 3.400 2.900 3.450 3.525 3.525 3.675 2.925
[100] 3.475 4.525 3.875 4.525 4.150 4.375 4.825 3.400 4.575 4.200 4.850
[111] 4.200 4.075 4.350 3.800 4.025 4.300 4.200 5.100 4.875 3.675 4.525
[122] 3.825 4.800 3.925 4.450 4.550 3.900 3.950 4.225 4.400 4.550 5.025
[133] 4.250 3.925 3.925 4.775 4.425 4.200 3.900 4.375 4.450 4.350 3.875
[144] 4.550 4.550 4.300 3.925 4.175 4.325 3.950

✔ 행과 열 방향 전환

> z <- matrix(1:20, nrow=4, ncol=5)
> z
     [,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

> t(z) #행과 열 방향 전환
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]    5    6    7    8
[3,]    9   10   11   12
[4,]   13   14   15   16
[5,]   17   18   19   20

✔ 조건에 맞는 행과 열의 값 추출

> ir.1 <- subset(iris, Species=="setosa")

> ir.2 <- subset(iris, Sepal.Length>5.0 & Sepal.Width>4.0)
> ir.2
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
16          5.7         4.4          1.5         0.4  setosa
33          5.2         4.1          1.5         0.1  setosa
34          5.5         4.2          1.4         0.2  setosa

> ir.2[,c(2,4)] #2,4열긔 값만 추출
   Sepal.Width Petal.Width
16         4.4         0.4
33         4.1         0.1
34         4.2         0.2

✔ 매트릭스와 데이터프레임의 산술연산

> a <- matrix(1:20,4,5)
> b <- matrix(21:40,4,5)
> a
     [,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
> b
     [,1] [,2] [,3] [,4] [,5]
[1,]   21   25   29   33   37
[2,]   22   26   30   34   38
[3,]   23   27   31   35   39
[4,]   24   28   32   36   40

> 2*a
     [,1] [,2] [,3] [,4] [,5]
[1,]    2   10   18   26   34
[2,]    4   12   20   28   36
[3,]    6   14   22   30   38
[4,]    8   16   24   32   40

> b-5
     [,1] [,2] [,3] [,4] [,5]
[1,]   16   20   24   28   32
[2,]   17   21   25   29   33
[3,]   18   22   26   30   34
[4,]   19   23   27   31   35

> 2*a + 3*b
     [,1] [,2] [,3] [,4] [,5]
[1,]   65   85  105  125  145
[2,]   70   90  110  130  150
[3,]   75   95  115  135  155
[4,]   80  100  120  140  160

> a+b
     [,1] [,2] [,3] [,4] [,5]
[1,]   22   30   38   46   54
[2,]   24   32   40   48   56
[3,]   26   34   42   50   58
[4,]   28   36   44   52   60

> b-a
     [,1] [,2] [,3] [,4] [,5]
[1,]   20   20   20   20   20
[2,]   20   20   20   20   20
[3,]   20   20   20   20   20
[4,]   20   20   20   20   20

> b/a
          [,1]     [,2]     [,3]     [,4]     [,5]
[1,] 21.000000 5.000000 3.222222 2.538462 2.176471
[2,] 11.000000 4.333333 3.000000 2.428571 2.111111
[3,]  7.666667 3.857143 2.818182 2.333333 2.052632
[4,]  6.000000 3.500000 2.666667 2.250000 2.000000

> a*b
     [,1] [,2] [,3] [,4] [,5]
[1,]   21  125  261  429  629
[2,]   44  156  300  476  684
[3,]   69  189  341  525  741
[4,]   96  224  384  576  800

> a <- a*3
> a
     [,1] [,2] [,3] [,4] [,5]
[1,]    3   15   27   39   51
[2,]    6   18   30   42   54
[3,]    9   21   33   45   57
[4,]   12   24   36   48   60

> b <- b-5
> b
     [,1] [,2] [,3] [,4] [,5]
[1,]   16   20   24   28   32
[2,]   17   21   25   29   33
[3,]   18   22   26   30   34
[4,]   19   23   27   31   35

📖 매트릭스와 데이터프레임의 자료구조 확인

✔ 매트릭스와 데이터프레임의 자료구조 확인

> class(iris) #iris 데이터셋의 자료구조 확인
[1] "data.frame"
> class(state.x77) #state.x77의 자료구조 확인
[1] "matrix" "array" 

> is.matrix(iris) #데이터셋이 매트릭스인지 확인
[1] FALSE
> is.data.frame(iris) #데이터셋이 데이터프레임인지 확인
[1] TRUE

> is.matrix(state.x77)
[1] TRUE
> is.data.frame(state.x77)
[1] FALSE

✔ 매트릭스와 데이터프레임의 자료구조 변환

#매트릭스를 데이터프레임으로 변환
> st <- data.frame(state.x77)
> class(st)
[1] "data.frame"

#데이터프레임을 매트릭스로 변환
> iris.m <- as.matrix(iris[,1:4])
> class(iris.m)
[1] "matrix" "array" 

✔ 데이터프레임의 열 추출

iris[,"Species"] #결과=벡터, 매트릭스와 데이터프레임 모두 가능

iris[,5] #결과=벡터, 매트릭스와 데이터프레임 모두 가능

iris["Species"] #결과=데이터프레임, 데이터프레임만 가능

iris[5] #결과=데이터프레임, 데이터프레임만 가능

iris$Species #결과=벡터, 데이터프레임만 가능
profile
╰(⊡-⊡)و✎⮹

0개의 댓글