반응형
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)
역행렬을 바로 구하고, 또 구한 역행렬과 원래 행렬을 곱해서 단위행렬이 됨을 확인했다.
(*역행렬이란 곱했을 때 단위행렬이 나오게 하는 행렬이다.)
반응형
'R ' 카테고리의 다른 글
R을 알아보자 (1) : 데이터 프레임(Data Frame), 가장 많이 사용하는 데이터 형태 (1) | 2019.08.05 |
---|
댓글