개인 공부 기록/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