Matrix

3-1 기본적인 매트릭스 만들기

z <- matrix(1:20, nrow=4,ncol=5)
z                         # 매트릭스 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

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

z2 <- matrix(1:20, nrow=4, ncol=5, byrow=T)
z2                                # 매트릭스 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

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

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

m1 <- cbind(x,y)                  # x와 y를 열 방향으로 결합하여 매트릭스 생성
m1                                # 매트릭스 m1의 내용을 출력
##      x y
## [1,] 1 5
## [2,] 2 6
## [3,] 3 7
## [4,] 4 8
m2 <- rbind(x,y)                  # x와 y를 행 방향으로 결합하여 매트릭스 생성
m2                                # 매트릭스 m2의 내용을 출력
##   [,1] [,2] [,3] [,4]
## x    1    2    3    4
## y    5    6    7    8
m3 <- rbind(m2,x)                 # 매트릭스 m2와 벡터 x를 행 방향으로 결합
m3                                # 매트릭스 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                                # 매트릭스 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

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

z <- matrix(1:20, nrow=4, ncol=5)   # 매트릭스 z 생성
z                                   # 매트릭스 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[2,, drop=FALSE]  # 차원축소 하지 않기: 행렬차원으로 출력
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    2    6   10   14   18
z[,4]                               # 4열에 있는 모든 값
## [1] 13 14 15 16

3-5 매트릭스에서 여러 개의 값을 동시에 추출하기

z <- matrix(1:20, nrow=4, ncol=5) # 매트릭스 z 생성
z                                 # 매트릭스 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[2,1:3, drop=FALSE]              # 2행의 값 중 1~3열에 있는 값(2차원 즉 행렬(matrix) 유지)
##      [,1] [,2] [,3]
## [1,]    2    6   10
z[1,c(1,2,4)]                     # 1행의 값 중 1, 2, 4열에 있는 값
## [1]  1  5 13
z[1,c(1,2,4), drop=FALSE]         # 1행의 값 중 1, 2, 4열에 있는 값(2차원 즉 행렬 유지)
##      [,1] [,2] [,3]
## [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

3-6 매트릭스의 행과 열에 이름을 지정하는 방법

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

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

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"

매트릭스 다루기

3-10 state.x77 데이터엣의 기본 내용 확인하기

dim(state.x77)       # 행과 열의 개수 출력
## [1] 50  8
nrow(state.x77)      # 행의 개수 출력
## [1] 50
ncol(state.x77)      # 열의 개수 출력
## [1] 8
colnames(state.x77)  # 열 이름 출력, names( )와 결과 동일
## [1] "Population" "Income"     "Illiteracy" "Life Exp"   "Murder"    
## [6] "HS Grad"    "Frost"      "Area"
head(state.x77)      # 데이터셋의 앞부분 일부 출력
##            Population Income Illiteracy Life Exp Murder HS Grad Frost   Area
## Alabama          3615   3624        2.1    69.05   15.1    41.3    20  50708
## Alaska            365   6315        1.5    69.31   11.3    66.7   152 566432
## Arizona          2212   4530        1.8    70.55    7.8    58.1    15 113417
## Arkansas         2110   3378        1.9    70.66   10.1    39.9    65  51945
## California      21198   5114        1.1    71.71   10.3    62.6    20 156361
## Colorado         2541   4884        0.7    72.06    6.8    63.9   166 103766
tail(state.x77)      # 데이터셋의 뒷부분 일부 출력
##               Population Income Illiteracy Life Exp Murder HS Grad Frost  Area
## Vermont              472   3907        0.6    71.64    5.5    57.1   168  9267
## Virginia            4981   4701        1.4    70.08    9.5    47.8    85 39780
## Washington          3559   4864        0.6    71.72    4.3    63.5    32 66570
## West Virginia       1799   3617        1.4    69.48    6.7    41.6   100 24070
## Wisconsin           4589   4468        0.7    72.48    3.0    54.5   149 54464
## Wyoming              376   4566        0.6    70.29    6.9    62.9   173 97203

3-11 state.x77 데이터셋의 추가적인 내용 확인하기

str(state.x77)       # 행렬 데이터셋의 내부 구조 확인 하기  
##  num [1:50, 1:8] 3615 365 2212 2110 21198 ...
##  - attr(*, "dimnames")=List of 2
##   ..$ : chr [1:50] "Alabama" "Alaska" "Arizona" "Arkansas" ...
##   ..$ : chr [1:8] "Population" "Income" "Illiteracy" "Life Exp" ...
state.x77[,5]        # 기대수명 데이터 보기 
##        Alabama         Alaska        Arizona       Arkansas     California 
##           15.1           11.3            7.8           10.1           10.3 
##       Colorado    Connecticut       Delaware        Florida        Georgia 
##            6.8            3.1            6.2           10.7           13.9 
##         Hawaii          Idaho       Illinois        Indiana           Iowa 
##            6.2            5.3           10.3            7.1            2.3 
##         Kansas       Kentucky      Louisiana          Maine       Maryland 
##            4.5           10.6           13.2            2.7            8.5 
##  Massachusetts       Michigan      Minnesota    Mississippi       Missouri 
##            3.3           11.1            2.3           12.5            9.3 
##        Montana       Nebraska         Nevada  New Hampshire     New Jersey 
##            5.0            2.9           11.5            3.3            5.2 
##     New Mexico       New York North Carolina   North Dakota           Ohio 
##            9.7           10.9           11.1            1.4            7.4 
##       Oklahoma         Oregon   Pennsylvania   Rhode Island South Carolina 
##            6.4            4.2            6.1            2.4           11.6 
##   South Dakota      Tennessee          Texas           Utah        Vermont 
##            1.7           11.0           12.2            4.5            5.5 
##       Virginia     Washington  West Virginia      Wisconsin        Wyoming 
##            9.5            4.3            6.7            3.0            6.9
class(state.x77[,5]) # 기대수명 데이터의 데이터 type 확인(numeric vector)
## [1] "numeric"
unique(state.x77[,3])# 문맹률 보기(중복 제거) 
##  [1] 2.1 1.5 1.8 1.9 1.1 0.7 0.9 1.3 2.0 0.6 0.5 1.6 2.8 2.4 0.8 2.2 1.4 1.0 2.3
## [20] 1.7
table(state.x77[,3]) # 문맹률별 행의 개수 세기(frequency table)
## 
## 0.5 0.6 0.7 0.8 0.9   1 1.1 1.3 1.4 1.5 1.6 1.7 1.8 1.9   2 2.1 2.2 2.3 2.4 2.8 
##   3  10   5   3   4   1   5   2   3   1   1   1   2   2   1   1   2   1   1   1

3-12 행렬, 열별 합계와 평균

colSums(state.x77)  # 열별 합계
## Population     Income Illiteracy   Life Exp     Murder    HS Grad      Frost 
##  212321.00  221790.00      58.50    3543.93     368.90    2655.40    5223.00 
##       Area 
## 3536794.00
colMeans(state.x77) # 열별 평균
## Population     Income Illiteracy   Life Exp     Murder    HS Grad      Frost 
##  4246.4200  4435.8000     1.1700    70.8786     7.3780    53.1080   104.4600 
##       Area 
## 70735.8800
rowSums(state.x77)  # 행별 합계
##        Alabama         Alaska        Arizona       Arkansas     California 
##       58094.55      573412.81      120312.25       57620.56      182838.71 
##       Colorado    Connecticut       Delaware        Florida        Georgia 
##      111500.46       13581.68        7604.76       67328.26       67280.04 
##         Hawaii          Idaho       Illinois        Indiana           Iowa 
##       12399.60       87872.27       72312.94       46121.58       63704.36 
##         Kansas       Kentucky      Louisiana          Maine       Maryland 
##       88987.58       46964.80       52419.96       35961.49       19544.92 
##  Massachusetts       Michigan      Minnesota    Mississippi       Missouri 
##       18632.73       70939.43       88178.46       52908.99       78253.59 
##        Montana       Nebraska         Nevada  New Hampshire     New Jersey 
##      150970.36       82809.40      115962.23       14426.83       20335.73 
##     New Mexico       New York North Carolina   North Dakota           Ohio 
##      126414.42       71027.55       58314.61       75308.28       56527.22 
##       Oklahoma         Oregon   Pennsylvania   Rhode Island South Carolina 
##       75692.52      103308.93       61528.73        6787.00       36860.66 
##   South Dakota      Tennessee          Texas           Utah        Vermont 
##       81102.58       49516.61      278726.70       87603.30       13948.84 
##       Virginia     Washington  West Virginia      Wisconsin        Wyoming 
##       49675.78       75165.12       29705.18       63800.68      102458.69
rowMeans(state.x77) # 행별 평균
##        Alabama         Alaska        Arizona       Arkansas     California 
##       7261.819      71676.601      15039.031       7202.570      22854.839 
##       Colorado    Connecticut       Delaware        Florida        Georgia 
##      13937.558       1697.710        950.595       8416.032       8410.005 
##         Hawaii          Idaho       Illinois        Indiana           Iowa 
##       1549.950      10984.034       9039.118       5765.198       7963.045 
##         Kansas       Kentucky      Louisiana          Maine       Maryland 
##      11123.448       5870.600       6552.495       4495.186       2443.115 
##  Massachusetts       Michigan      Minnesota    Mississippi       Missouri 
##       2329.091       8867.429      11022.308       6613.624       9781.699 
##        Montana       Nebraska         Nevada  New Hampshire     New Jersey 
##      18871.295      10351.175      14495.279       1803.354       2541.966 
##     New Mexico       New York North Carolina   North Dakota           Ohio 
##      15801.802       8878.444       7289.326       9413.535       7065.903 
##       Oklahoma         Oregon   Pennsylvania   Rhode Island South Carolina 
##       9461.565      12913.616       7691.091        848.375       4607.583 
##   South Dakota      Tennessee          Texas           Utah        Vermont 
##      10137.823       6189.576      34840.838      10950.413       1743.605 
##       Virginia     Washington  West Virginia      Wisconsin        Wyoming 
##       6209.472       9395.640       3713.148       7975.085      12807.336

3-13 행과 열의 방향 전환

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

3-14 행과 열의 값 추출

st.1 <- state.x77[,c(3,4)]    # 3, 4열의 값만 추출
head(st.1)
##            Illiteracy Life Exp
## Alabama           2.1    69.05
## Alaska            1.5    69.31
## Arizona           1.8    70.55
## Arkansas          1.9    70.66
## California        1.1    71.71
## Colorado          0.7    72.06

3-15 매트릭스에 대한 산술연산

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 # 매트릭스 a에 저장된 값들에 2를 곱하기
##      [,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
b <- b-5

3-16 매트릭스의 자료형 확인

class(iris)          # iris 데이터셋의 자료형 확인 
## [1] "data.frame"
class(state.x77)     # state.x77 데이터셋의 자료형 확인 
## [1] "matrix"
is.matrix(iris)      # iris 데이터셋이 행렬(matrix)인지를 확인하는 함수 
## [1] FALSE
is.matrix(state.x77) # state.x77 데이터셋이 행렬(matrix)인지를 확인하는 함수
## [1] TRUE

3-17 매트릭스의 자료형 변환

# 매트릭스를 데이터프레임으로 변환
st <- data.frame(state.x77)
head(st)
##            Population Income Illiteracy Life.Exp Murder HS.Grad Frost   Area
## Alabama          3615   3624        2.1    69.05   15.1    41.3    20  50708
## Alaska            365   6315        1.5    69.31   11.3    66.7   152 566432
## Arizona          2212   4530        1.8    70.55    7.8    58.1    15 113417
## Arkansas         2110   3378        1.9    70.66   10.1    39.9    65  51945
## California      21198   5114        1.1    71.71   10.3    62.6    20 156361
## Colorado         2541   4884        0.7    72.06    6.8    63.9   166 103766
class(st)
## [1] "data.frame"
# 데이터프레임을 매트릭스로 변환
iris.m <- as.matrix(iris[,1:4])
head(iris.m)
##      Sepal.Length Sepal.Width Petal.Length Petal.Width
## [1,]          5.1         3.5          1.4         0.2
## [2,]          4.9         3.0          1.4         0.2
## [3,]          4.7         3.2          1.3         0.2
## [4,]          4.6         3.1          1.5         0.2
## [5,]          5.0         3.6          1.4         0.2
## [6,]          5.4         3.9          1.7         0.4
class(iris.m)
## [1] "matrix"

배열(array) 생성 및 인덱싱

z <- 1:24
dim(z) <- c(3,4,2)
z
## , , 1
## 
##      [,1] [,2] [,3] [,4]
## [1,]    1    4    7   10
## [2,]    2    5    8   11
## [3,]    3    6    9   12
## 
## , , 2
## 
##      [,1] [,2] [,3] [,4]
## [1,]   13   16   19   22
## [2,]   14   17   20   23
## [3,]   15   18   21   24
ary <- array(1:12, c(2,3,2))
ary
## , , 1
## 
##      [,1] [,2] [,3]
## [1,]    1    3    5
## [2,]    2    4    6
## 
## , , 2
## 
##      [,1] [,2] [,3]
## [1,]    7    9   11
## [2,]    8   10   12
ary[1,3,2]
## [1] 11
ary[,1,2]
## [1] 7 8
ary[,1,2,drop=FALSE]
## , , 1
## 
##      [,1]
## [1,]    7
## [2,]    8
ary[2,,]
##      [,1] [,2]
## [1,]    2    8
## [2,]    4   10
## [3,]    6   12