개인 공부 기록/R 컴퓨팅
R 데이터 구조(1) _ 백터, 행렬의 특성 및 연산
mindata1
2025. 3. 4. 10:00
학습 목표
1. 벡터의 특성을 이해하고 생성할 수 있다.
2. 행렬의 특성을 이해하고 생성할 수 있다.
3. 벡터에 관한 연산을 실행할 수 있다.
4. 행렬에 관한 연산을 실행할 수 있다.
1. 벡터
벡터의 생성
- 1개 이상의 원소로 구성된 자료구조로 R의 자료 객체 중에서 가장 기본이 되는 자료 객체를 의미
- 벡터 하나의 원소는 한 가지 형태(mode)만 가능하다는 점에 유의
- 즉, 수치형이나 문자형, 논리형 중 한 가지 형태로만 이루어져야 함
- 벡터는 기본적으로 다음과 같은 방법으로 생성 가능
- c( ), scan( ) : 직접 자료를 입력
- seq( ) : 조건에 따른 벡터를 생성
- rep( ) : 자료값들을 반복하여 생성
c( )
> c(3,4,5,6,7) # 함수 내 입력된 값을 조합
[1] 3 4 5 6 7
> c(3:7) # 함수 내 수열 값을 입력
[1] 3 4 5 6 7
> c(7,3,5,4,6) # 순서 임의로 지정 가능
[1] 7 3 5 4 6
- 문자형 벡터 생성 시 큰따옴표(" ") 반드시 추가해야함
> c("1","KOREA","NATIONAL","OPEN")
[1] "1" "KOREA" "NATIONAL" "OPEN"
- length( ) : 벡터의 크기 출력
> c("1","KOREA","NATIONAL","OPEN")
[1] "1" "KOREA" "NATIONAL" "OPEN"
> v1 <- c("1","KOREA","NATIONAL","OPEN")
> length(v1)
[1] 4
- c( ) 함수를 이용해 논리형 벡터 생성 가능
> c(F,F,T)
[1] FALSE FALSE TRUE
> c(TRUE,FALSE,TRUE)
[1] TRUE FALSE TRUE
scan( )
> scan()
1: 3 4 5
4: 6 7
6:
Read 5 items
[1] 3 4 5 6 7
> scan()
1: 3 4 5
4: 6 7
6:
Read 5 items
[1] 3 4 5 6 7
> scan(sep=",")
1: 3
2: 4,5
4: 6,7
6:
Read 5 items
[1] 3 4 5 6 7
seq( )
> seq(from=3, to=7, by=1) # from=시작값, to=종료값, by=증가분
[1] 3 4 5 6 7
> seq(to=7, from=3, by=1)
[1] 3 4 5 6 7
> seq(by=1, from=3, to=7)
[1] 3 4 5 6 7
예제: c( ) 로 기본 벡터 생성 후 rep( ) 로 생성된 벡터의 일정 원소가 반복되는 벡터를 만들어보자.
> rep(c(1,2), times=2) # 1, 2로 구성된 벡터를 2회 반복
[1] 1 2 1 2
> rep(1:2, times=2) # 1:2 1에서 2까지로 구성된 벡터를 2회 반복
[1] 1 2 1 2
> rep(c(2,4), times=c(2,1)) # 앞의 원소는 2회, 뒤의 원소는 1회 반복
[1] 2 2 4
> rep(c(2,4), each=2) # 앞, 뒤 모든 원소를 2회 반복
[1] 2 2 4 4
> rep(c(2,4,8), length=5) # 2,4,8로 구성된 벡터를 반복하되 생성되는 벡터의 크기를 5로 한정
[1] 2 4 8 2 4
벡터 자료의 편집
- na.last=TRUE : 만약 결측치가 존재한다면 이러한 결측치들을 자료의 맨 끝에 위치하는 것으로 간주
- decreasing=FALSE : 오름차순을 기본값
벡터명[원소번호 또는 조건문, ...] | : 벡터의 일부 원소 추출 |
replace(벡터, 원소번호, 교체자료) | : 일부 자료를 대체 |
append(벡터, 삽입자료, after=원소번호) | : 조건에 따른 위치에 자료를 삽입 |
sort(벡터, decreasing=FALSE, ...) | : 자료를 정렬 |
rank(벡터, na.last=TRUE, ties.method=c("average", "first", "random", "max", "min") ) | : 자료의 순위를 출력 |
order(벡터, na.last=TRUE, decreain=FALSE ) | : 오름차순에 의한 자료의 위치값 출력 |
- 벡터의 일부 원소 추출 시 유의점
- 하나의 원소만을 지정할 때 : [ ] 기호 내 원소번호 그대로 입력
- 복수의 원소 지정할 때 : 반드시 c( ) 을 이용해 묶음으로 지정
## 예제_3-9
> v1 <- c(11:20) # 11~20 값을 갖는 벡터 생성
> v1
[1] 11 12 13 14 15 16 17 18 19 20
> v1[(c(3,5))] # 세번째와 다섯번째 값 출력
[1] 13 15
> v1[v1>15] # 15보다 큰 값 출력
[1] 16 17 18 19 20
> v1[c(-2,-4)] # 두번째와 네번째 값 삭제 후 출력
[1] 11 13 15 16 17 18 19 20
## 예제_3-10
> v2 <- c(3:7)
> v2
[1] 3 4 5 6 7
> replace(v2,2,10) # 두번째 원소 값 10으로 변경
[1] 3 10 5 6 7
> append(v2,8,after=5) # 다섯번째 값 다음에 8 추가
[1] 3 4 5 6 7 8
> v3 <- append(v2,8,after=5)
> v3
[1] 3 4 5 6 7 8
2. 행렬
- 동일한 형태로 구성된 2차원의 데이터 구조
- 벡터와 마찬가지로 하나의 행렬은 수치형, 문자형, 논리형 중 한 가지 형태의 원소만 가짐
- 행렬의 속성이 벡터의 속성을 포함함
속성 | 설명 |
length | 자료의 개수 |
mode | 자료의 형태 |
dim | 행과 열의 개수 |
dimnames | 행과 열의 이름 |
> matr <- matrix(1:9, nrow=3) # 3행 3열 행렬 생성
> matr
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
> length(matr)
[1] 9
> mode(matr)
[1] "numeric"
> dim(matr)
[1] 3 3
행렬의 생성
- matrix( ) : 직접 생성
- cbind( ) : 벡터를 열을 기준으로 병합
- rbind( ) : 벡터를 행을 기준으로 병합
- dim( ) : 차원(행, 열의 개수)을 직접 지정
matrix(data, nrow=, ncol=, byrow=FALSE, dimnames=NULL) | nrow(행 개수), ncol(열 개수), byrow(열 기준 행렬 생성) |
cbind(v1, v2, ...) | |
rbind(v1, v2, ...) | |
dim(x) <- c(행의 개수, 열의 개수) |
## 예제_3-12
> r1 <- c(1,2,3)
> r2 <- c(4,5,6)
> r3 <- c(7,8,9)
> rbind(r1,r2,r3) # 행 기준 결합
[,1] [,2] [,3]
r1 1 2 3
r2 4 5 6
r3 7 8 9
>
> c1 <- c(1:3)
> c2 <- c(4:6)
> c3 <- c(7:9)
> cbind(c1,c2,c3) # 열 기준 결합
c1 c2 c3
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
>
> m1 <- 1:9 # : 만으로도 c(1:9)와 동일한 기능 수행
> dim(m1) <- c(3,3) # dim: 차원을 지정
> m1
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
행렬의 연산
- [ ] : 행렬의 일부 원소 추출
- apply( ) : 행(열) 연산
- sweep( ) : 행(열) 연산
행렬명[원소번호 또는 조건문, ...] |
apply(행렬, 조건(1은 행, 2는 열, c(1,2)는 행과 열), FUN, ...) |
sweep(행렬, 조건(1은 행, 2는 열, c(1,2)는 행과 열), STATS, FUN="-", ...) |
- FUN : 연산함수
- sweep( ) 함수에서는 기본연산이 뺄셈으로 지정되어 있음
- STATS : 연산에 활용되는 통계량이나 데이터
원소 추출
> mat <- matrix(c(1,2,3,4,5,6,7,8,9), ncol=3, byrow=T)
> mat
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
[3,] 7 8 9
> mat[1,] # 1행의 값
[1] 1 2 3
> mat[,3] # 3열의 값
[1] 3 6 9
> mat[mat[,3] > 4, 2] # 3열에서 4보다 큰 행의 값 중 2열의 모든 값
[1] 5 8
> mat[2,3] # 2행 3열의 값 추출
[1] 6
apply( )
> Height <- c(120,155,142,175)
> size.1 <- matrix(c(130,26,110,24,118,25,112,25), ncol=2, byrow=T,
+ dimnames=list(c("Lee","Kim","Park","Choi"), c("Weight","Waist")))
> size <- cbind(size.1, Height)
> size
Weight Waist Height
Lee 130 26 120
Kim 110 24 155
Park 118 25 142
Choi 112 25 175
> colmean <- apply(size,2,mean) # 열의 평균값 계산
> colmean
Weight Waist Height
117.5 25.0 148.0
> rowmean <- apply(size,1,mean) # 행의 평균값 계산
> rowmean
Lee Kim Park Choi
92.00000 96.33333 95.00000 104.00000
> colvar <- apply(size,2,var) # 열의 분산값 계산
> colvar
Weight Waist Height
81.0000000 0.6666667 532.6666667
> rowvar <- apply(size,1,var) # 행의 분산값 계산
> rowvar
Lee Kim Park Choi
3292.000 4430.333 3819.000 5673.000
sweep( )
> sweep(size,2,colmean) # size 각 열의 값과 colmean 의 차
Weight Waist Height
Lee 12.5 1 -28
Kim -7.5 -1 7
Park 0.5 0 -6
Choi -5.5 0 27
>
> sweep(size,1,rowmean) # size 각 행의 값과 rowmean 의 차
Weight Waist Height
Lee 38.00000 -66.00000 28.00000
Kim 13.66667 -72.33333 58.66667
Park 23.00000 -70.00000 47.00000
Choi 8.00000 -79.00000 71.00000
>
> sweep(size,1,c(1,2,3,4),"+") # size 각 행의 값에 c(1,2,3,4)값을 더해줌
Weight Waist Height
Lee 131 27 121
Kim 112 26 157
Park 121 28 145
Choi 116 29 179
>
> sweep(size,1,c(1,2,3,4),"-") # size 각 행의 값에 c(1,2,3,4)값을 빼 줌
Weight Waist Height
Lee 129 25 119
Kim 108 22 153
Park 115 22 139
Choi 108 21 171