본문 바로가기
R

R을 알아보자 (2) : R 벡터, 행렬 알아보기

by 춘춘주모 2019. 8. 5.
반응형

2019-08-05

 

R에서의 벡터(리스트) 슬라이싱은 파이썬과 다소 다릅니다. 간단한 벡터를 생성하고 슬라이싱 해보며 알아보고자 합니다. 

R 벡터(Vector)

(1) 실습 코딩 

*1부터 숫자를 셉니다

vec1 <- c(1,2,3,4,5) #벡터 생성 
vec1

vec1[-1] #첫 번째 원소를 제외
vec1[-1:-3] # 첫 번째~세 번째 까지 제거 
vec1[1:(length(vec1)-2)] # 첫 번째~ 세 번째 까지를 표시 
vec1[1:3]
vec1[9] <- 9 #9번 째 원소에 9를 추가하는데, 중간 인덱스에 해당하는 값은 NA(결측치)로 표시
vec1
append(vec1,10,after = 3)#vec1의 3번째 원소 뒤에 10을 넣기 

 

(2) 실습 코딩 

*자료형을 동일하게 저장합니다.

vec2 <- c(1,2,3,4,"5")
vec2 #모두 문자로 저장되었음을 알 수 있다! 

 

 

 

(3) 실습 코딩 

벡터 연산 

var1 <- c(1,2,3)
var2 <- c(3,4,5)
var1 + var2 

var3 <- c('3','4','5')
var1 + var3 #연산에 수치가 아닌 부분이 있어 에러 발생 

union(var1, var3)
var4 <- c(1,2,3,4,5)
var1 + var4 #객체의 길이가 달라 에러 발생 


#배수관계라면 길이가 짧은 벡터를 n번 반복해 연산하면 되므로 에러 발생 x 
var5 <- c(1,2,3,4,5,6) 
var1 + var5

var1 - var2
setdiff(var1, var2) #차집합
setdiff(var2, var1) #차집합
intersect(var1, var2) #교집합

 

(4) 실습 코딩

 요소에 이름 지정, 연속 데이터 할당

#벡터의 각 요소에 이름 지정 
fruits <- c(10,20,30)
fruits
names(fruits) <- c("apple","banana",'peach')
fruits

#벡터에 연속적 데이터 할당 
var5 <- seq(1, 5); var5
var6 <- seq(2, -2); var6
var7 <- seq(1,10,2); var7
var8 <- rep(1:3,2); var8
var9 <- rep(1:3, each = 2); var9 #한 줄에 코딩하기 위해 ; 사용했습니다. 

 

(5) 실습 코딩

#벡터 길이 찾기, NROW()
var1 <- c(1,2,3)
length(var1)
NROW(var1)

#벡터에 특정데이터 포함 여부 확인, %in%
var7 <- c(1,3,5,7,9)
3 %in% var7
4 %in% var7

 

R 행렬(Matrix)

(1) 행렬 만들기, 행이나 열 개수를 지정하면 그대로 나온다 

#행렬 만들기, matrix()
mat1 <- matrix(c(1,2,3,4)); mat1
mat2 <- matrix(c(1,2,3,4), nrow = 2); mat2
mat3 <- matrix(c(1,2,3,4), ncol = 2); mat3 
mat4 <- matrix(c(1,2,3,4,5,6,7,8,9), nrow = 3); mat4
mat5 <- matrix(c(1,2,3,4,5,6,7,8,9), nrow = 3, byrow = T); mat5 #행 순서대로 정렬 

(2) 만든 행렬을 인덱싱 하면서 R에서의 인덱싱 특징을 알아보도록 합시다

-1은 제외를 의미하는 점이 특이합니다. 

#행렬 인덱싱
mat3
mat3[,1] #1열 
mat3[1,] #1행 
mat3[1,1] #1행 1열
mat3[-1,2] #1행 제외하고 2번째 열에 있는 원소 4 
mat3[,-1] #1열 제외하고 나머지 출력 
mat3[-1,] #1행 제외하하고 나머지 출력 
mat3[1:2,2]#1행에서 2행 까지에서 2열만 출력 

mat4[-1,2] #2행을 제외한 2열의 원소 
mat4[-1,-1] #1행과 1열 제외
mat4[-1:-2] #1행의 2열까지만 제외하고 출력 

(3) rbind와  cbind

rbind는 행 방향으로 붙이고 , cbind는 열 방향으로 붙인다. 

mat4 <- rbind(mat4, c(15,16,17,18))  #추가되는 데이터가 크면 남은 부분 버림
mat4 <- rbind(mat4, c(19,20)) #모자르면 기존 데이터 재사용
mat4

mat6 <- matrix(c('a','b','c','d'), nrow=2, byrow=T);mat6
mat6<-cbind(mat6,c('e','f'));mat6

행렬에 이름 붙이기, 행렬에 이름을 각각 지정해 줄 수 있다. 

mat4 <- rbind(mat4, c(15,16,17,18))  #추가되는 데이터가 크면 남은 부분 버림
mat4 <- rbind(mat4, c(19,20)) #모자르면 기존 데이터 재사용
mat4

mat6 <- matrix(c('a','b','c','d'), nrow=2, byrow=T);mat6
mat6<-cbind(mat6,c('e','f'));mat6

colnames(mat6)<-c("First", "Second", "Third")
rownames(mat6)<-c("row1", "row2")
#dimnames(mat5) <- list(c("row1", "row2"), c("First", "Second", "Third"))
mat6

 

(4) 행렬의 연산과 역행렬, 전치 행렬 

x<- matrix(1:9, nrow=3)
x
x
x*2
x/2
x+3
x-2
x+x
x-x
x%*%x #행렬간 곱셈

행렬과 곱셈은 단순하게 같은 자리끼리 곱하는 개념과는 다릅니다. (추가 보충설명 예정)

 

 

 

y<-matrix(1:4, ncol=2)
y
solve(y) #역행렬

y %*% solve(y)

x<-matrix(1:9, nrow=3)
x
t(x)  #전치행렬
nrow(x)
ncol(x)

역행렬을 바로 구하고, 또 구한 역행렬과 원래 행렬을 곱해서 단위행렬이 됨을 확인했다. 

(*역행렬이란 곱했을 때 단위행렬이 나오게 하는 행렬이다.) 

반응형

댓글