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
- 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열의 데이터
- 매트릭스와 데이터 프레임은 모두 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
> 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 #결과=벡터, 데이터프레임만 가능