관리 메뉴

IT journey

R-벡터,행렬 본문

개인공부공간/R

R-벡터,행렬

step 2021. 6. 3. 22:25
728x90
반응형

직접 내용 정리하고 만든 예이니 퍼가실 때는 출처를 남겨주세요 :)

벡터

벡터에 데이터 추가(스칼라 및 벡터들의 결합)

(1) Combine 함수 c()

x<-c(1,2)
y<-c(6,7,8)
c(x,y)

(2) 함수 append()는 추가되는 스칼라 혹은 벡터의 위치의 조절하여 삽입이 가능합니다.

x<-c(1,2)
y<-c(5,6)
append(x,y)
append(x,y,after=1)

일정한 수열을 갖는 벡터 만들기

(1) 콜론(:)으로 생성하기

a:b 로 하게 되면 a를 시작점으로 b를 초과하지 않을 때까지 1씩 증가하는 수열을 되고,

a>b이면 1씩 감소하는 수열이 됩니다.

1:10
5:0

(2) 함수 seq() 로 수열 자료 생성하기

연속된 값으로 벡터를 초기화합니다.

seq(from=0,to=6) #seq(0,6)
seq(from=0,to=6,by=2) #seq(0,6,by=2)
seq(from=0,to=6,length=2) #seq(0,6,len=2) #length 수만큼 나옵니다.
seq(from=0,by=2,length=2) #seq(0,by=2,len=2)

#한 숫자로만 구성할 경우에는 1을 기준으로 1씩 증가하거나 감소합니다.
seq(5)
seq(-5)

참고로, 함수 seq_along() 또는 seq_len()를 사용하게 되면

  • 함수에 들어가는 벡터와 길이가 같으며 시작을 1로 하며 1씩 증가하는 수열이 생성됩니다.
#selt_along은 길이만큼의 값으로 벡터를 초기화합니다.
x <-c(2,4,6,8,10,12)
seq(along=x)
seq_along(x)
seq(length=length(x))
seq_len(length(x))
  • 날짜 함수에 대해 먼저 알아본 뒤 seq()를 이용한 예를 알아봅시다.

날짜 함수는 시간 흐름에 따라 데이터를 얻을 경우 중요한 변수입니다.

문자형 벡터에 함수 as.Date()를 적용한 것으로 문자형 벡터의 디폴트 형태는 yyy-mm-dd입니다.

x<-as.Date(c("2020-06-03","2020-06-12"))
x

#유형은 숫자형으로 1970년 1월 1일부터의 날수 입니다.
typeof(x) #타입을 알아보는 함수입니다.
typeof(x)
x[2]-x[1]

#seq()를 적용한 예를 알아봅시다.
#동일한 간격의 날짜 생성하려면 옵션에 by를 넣으면 됩니다.
x1<-as.Date("2021-06-03")
x2<-as.Date("2021-06-30")
seq(from=x1,to=x2,by=12)

#간격을 주간격 혹은 월간격 또는 연 단위로 조절이 가능합니다.
x1<-as.Date("2021-06-03")
x2<-as.Date("2021-06-30")
seq(from=x1,by="week",length=12)
seq(from=x1,by="month",length=12)
seq(from=x1,by="year",length=12)

(3) 일정한 패턴을 갖고 있는 함수 rep()

rep 함수는 특정 값으로 지정된 횟수만큼 반복해서 벡터를 초기화합니다.

- rep()과 옵션 times의 활용한 예를 살펴봅시다.

rep(6,times=6)
rep(1:5,times=2)
rep(c("J","I"),times=c(3,2))

times에 하나의 숫자를 지정하게 되면 데이터 전체를 숫자만큼 반복하지만,

times에 벡터를 지정하게 되면 반복 대상 데이터와 일대일 대응시켜서 반복합니다. 

 

- rep()과 옵션 each와 times의 활용한 예를 살펴봅시다.

#데이터 요소가 each번 반복합니다.
rep(4:6,each=2) 
#데이터 요소가 each번 반복 전체로 times번 반복합니다.
rep(4:6,each=2,times=4)

- 옵션 each와 length의 활용한 예를 살펴봅시다.

#길이 length가 될 때까지 데이터 전체가 반복됩니다.
rep(4:10,each=2,length=4)

벡터의 연산

- 벡터와 벡터의 연산은 대응되는 각 구성요소끼리의 연산으로 이루어집니다.

x<-c(5,6,7,8)
y<-c(9,5,2,6)
x
x+3 #x의 요소들 각각에 3을 더해줍니다.
y/2 #y의 요소들 각각에 2를 나누어줍니다.
2^x #x의 요소들 각각을 2의 거듭제곱 계산 합니다.

- 벡터의 연산 시 나올 수 있는 문자 : -Inf, Inf, NaN

c(-2,0,1)/0
sqrt(-5)
Inf-Inf
Inf/Inf

- 벡터의 순환법칙

c(1,2,3,4,5)+c(1,2)
1:5+1:2

길이가 짧은 c(1,2)를 순환반복해서 c(1,2,1,2,1)을 만든 뒤  c(1,2,3,4,5)와 연산을 합니다.

벡터와 스칼라의 연산에서도 이와 같은 순환법칙이 사용됩니다.또한 다양한 함수에서 순환법칙이 적용됩니다.

 

다양한 함수

함수를 들어가기 전 간단한 연산하는 예를 보겠습니다.

2+3 #더하기
2-3 #빼기
2*3 #곱하기
6/4 #나누기
6%/%4 #몫
6%%4 #나머지
2^3 #지수
pi #파이

연산자들 간의 우선순위

^(지수) -> : 콜론 연산자 -> %any% 특별 연산자 -> * 곱하기 / 나누기

->+ 더하기 - 빼기 -> == != < > <= >= 비교 연산자 -> & && 논리 연산자 AND

-> | || 논리 연산자 OR

 

참고로, 특별연산자를 알아봅시다.

  • %%는 나머지 연산자를 말합니다.
  • %/%는 몫을 구할 때 쓰는 연산자 입니다.
  • %*%는 행렬의 곱하기 연산자입니다.
  • %in%는 데이터에 특정 값의 포함여부 확인하는 연산자입니다.

○ 수학계산함수에 대해 알아봅시다.

abs() 절대값 나오는 함수입니다.
sqrt()  제곱근 계산하는 함수입니다.
ceiling() 숫자보다 작지 않은 가장 작은 정수입니다.
만약 4.567이면 5가 나오며,
-4.567이면 -4가 나옵니다.
floor() 숫자보다 크지 않은 가장 큰 정수나오는 함수입니다.
만약 4.567이면 4가 나오며,
-4.567이면 -5가 나옵니다.
trunc() 소수점 이하를 버리는 함수입니다.
만약 4.567이면 4가 나옵니다.
round() 반올림하는 함수입니다.
만약 round(4.567,2)처럼 입력하게 되면
그것은 4.567에서 2자리로 반올림하는 것이며,
4.57이 나옵니다.
signif() 유효수로 반올림하는 함수입니다.
만약 signif(0.004567,2)로 입력하게 되면
그것은 0.0046이 나옵니다.
exp() 지수함수입니다.
exp(5)처럼 입력가능합니다.
sin() 삼각함수입니다.
sin(2)처럼 입력이 가능합니다.
asin(sin()) 역삼각함수입니다.
asin(sin(2)) 이런식으로 입력이 가능합니다.
log() 로그입니다.
log(2,base=5) 처럼 입력하게 되면
진수는 2, 밑은 5인 로그입니다.
log() 자연로그입니다.
log(5) 처럼 입력이 가능합니다.
log10() 상용로그입니다.
log10(1) 처럼 입력이 가능합니다.
exp(log(5)) 지수함수.자연로그의 역함수입니다.
exp(log(5))처럼 입력시,5로 나옵니다.

○ 통계계산함수

참고로, 함수를 돌려보고 싶을 때에는 x<-c(15,8,7,5,2) 먼저 놓고 돌려보면 됩니다.

mean() 평균을 구할 수 있습니다.
median()
중앙값을 구할 수 있습니다.
참고로, 중앙값을 구하고자하는 요소가 짝수개이면 그 두개의 요소를 더한뒤 2로 나누어줍니다

참고로, mean과 median의 차이가 크면 쏠린게 존재하다고 생각하면 됩니다.

var() 분산을 구할 수 있습니다.
sd()
표준편차를 구할 수 있습니다.
IQR()
Inter-Quartile Range(사분범위)를 구할 수 있습니다.
range()
범위를 구할 수 있습니다.
sum()
합을 구할 수 있습니다.
min()
최소값을 구할 수 있습니다.
max()
최대값을 구할 수 있습니다.
diff()
각 요소들의 간의 차이를  각각 구하여 반환해줍니다.

○문자함수

함수 기능
nchar(x) 문자열 x의 구성하는 문자의 개수을 알려주는 함수입니다.
paste(...,sep="")
빈칸 없이 문자열들의 결합을 보여주는 함수입니다.


paste0()
substr(x,start,stop) 문자열의 일부분 선택을 보여주는 함수입니다.
start,stop에는 정수형 스칼라  또는 벡터
(대응되는 숫자끼리 시작점과 끝점 구성)
toupper(x) 영문자 대문자로 변환하는 함수입니다.
tolower(x) 영문자 소문자로 변환하는 함수입니다.
strsplit(x,split) 문자열의 분리하는 함수입니다.
sub(old,new,x) 문자열의 치환하는 함수로,
문자열의 첫번째 old만 new로 치환합니다.
gsub(old,new,x) 문자열 치환하는 함수로,
문자열의 모든 old로 new로 치환합니다.


문자함수에 대한 예
는 아래와 같습니다.

#nchar()함수의 예
x<-c("IT","journey")
nchar(x)

#paste() 함수의 예
paste("IT","journey","의",sqrt(400),"포스팅입니다")
paste("IT","journey","의",sqrt(400),"포스팅입니다",sep=',')
paste("Step",1:2,sep=" ")
paste0("Step",1:2)

#collapse : 문자형 벡터와 문자열을 하나로 결합하는 옵션
letters[6:10] #영소문자
LETTERS[1:5] #영대문자
paste0(LETTERS,collapse=".")

#strsplit()의 예
x<-c("IT","journey","sj")
(y<-strsplit(x,","))
unlist(y)

#substr()의 예
substr("IT journey",1,5)
x<-c("IT","journey","sj")
substr(x,c(1,2),c(4,6))

#toupper()와 tolower()의 예
x<-c("IT","journey","sj")
x<-toupper(x)
x
x<-tolower(x)
x
#벡터 x의 첫글자만 대문자로 변화시킬려면
substr(x,1,1)<-toupper(substr(x,1,1))
x

#sub(old,new,x)과 gsub(old,new,x)의 예
x<-"Never say Never"
sub("Never","No",x)
gsub("Never","No",x)

x <-"2021.06.03"
gsub('\\.', '-', x)

#문자열을 분리해봅시다.
unlist(strsplit("IT journey",split=""))
#주의해야할 사항은 
#점(.)을 기준으로 문자로 분리하고 싶을 경우는 위에서와 같이 \\.  나 [.]을 써야합니다.

○벡터 연산

setqual()
두  벡터가 같은 집합인지 알려주는 함수입니다.
setdiff() 차집합 함수입니다.
intersect() 교집합 함수입니다.
union() 합집합 함수입니다.
identical() 객체가 동일한지 알려주는 함수입니다.

벡터 연산의 예는 아래와 같습니다.

identical(c(1,5),c(5,6))
1 %in% c(1,5,46,7) #1,5,46,7 안에 1이 있는가?
union(c(1,5,46,8),c(5,6,7))
intersect(c(1,5,46,8),c(5,6,7))
setdiff(c(1,5,46,8),c(5,6,7))

벡터의 비교연산

관계연산자를 다루었던 Python - 자료형 (숫자형,문자열,불린형)  C언어-연산자 그리고

논리연산자를 다루었던 Python-자료형(리스트,튜플) C언어-연산자 를 봐주시고 오신다면 수월하게 아래내용을 이해할 수 있습니다.

#벡터끼리 비교연산한 예
x<-c(6,12,10)
y<-c(31,12,4)

x>y
x>=y
x<y
x<=y
x==y
x!=y

#벡터와 스칼라의 비교연산한 예
x<-6:12
x>8
x<8
x<=7|x<=12
x<=8&x>=6

#각 요소끼리의 비교가 아닌 전체로 비교를 할 때는 any(),all()를 씁니다.
x<-5:12
any(x>=8)
all(x<5)

x<-5:12 
sum(x>=8) #벡터의 구성요소 중 특정조건을 만족하는 요소의 개수를 구할 때
mean(x>=8) #벡터의 구성요소 중 특정조건을 만족하는 비율을 구하기를 원할 때

벡터의 인덱싱

인덱싱을 들어가기 전 R은 몇부터 세는지 꼭 되새김질 하셔야 합니다.

혹여 생각이 나지 않으시다면 R-데이터 유형과 객체 간략히 살펴보기 를 다시 봐주시길 부탁드립니다.

이제 본론으로 돌아가 벡터의 인덱싱에 대해서 알아보겠습니다.

이것 역시 아까 보신 글에서 보셨을테지만 두 가지로 나누어 다시 한 번 더 정리해보겠습니다.

대괄호 색인 직접 지정 하는 방법으로 양수로 색인을 지정하게 되면 해당요소를 선택하고,

음수 색인을 지정하게 되면 해당요소를 제외하고 선택합니다.

② 논리형 벡터에 의한 색인 지정하는 방법으로 TRUE가 있는 위치의 자료를 선택하며, 이것은 벡터가 비교에 의한 자료 선택에서 쓰입니다.

이에 대한 예 또한 아까 보신 글에서 봐주시길 부탁드립니다.

참고로, 문자열 인덱싱을 한 예는 아래에서 살펴봅시다.

x<-c("Star, Sr","Anna, Aa")
x<-strsplit(x,",")
c(x[[1]][2],x[[2]][1])
unlist(x)[c(2,3)]

행렬

(1) 생성하는 방법

R-데이터 유형과 객체 간략히 살펴보기 에서 보신 분들을 생성하는 방법을 기억하고 계실꺼라 생각듭니다.

기억이 안나셔도 좋습니다. 바로 아래에 한가지 방법을 더 추가해 3가지로 정리해볼테니 이번에 더욱 집중해서 봐주시면 됩니다.

㉮함수 cbind()를 쓰게 되면 벡터들을 열 단위로 묶어 행렬을 생성하고,

함수 rbind()를 쓰게 되면 벡터들을 행 단위로 묶어 행렬을 생성합니다.

㉯행렬 matrix()를 이용하여 행과 열의 개수 nrow= 또는 ncol= 로 지정합니다.

지정하게 되면 자료는 열 기준으로 입력하기 때문에, 자료를 행 단위로 입력하기를 원한다면 옵션인 byrow=TRUE를 추가해야 합니다. byrow=FALSE로 하게 되면 열 기준으로 입력합니다. 

㉰함수 dim()을 이용하면 됩니다.

참고로, 행과 열, 차원들의 이름을 붙이는 방법과 인덱싱 하는 방법은 R-데이터 유형과 객체 간략히 살펴보기에서 봐주시길 바랍니다.

x<-cbind(letters[1:4],c(1:4))
y<-rbind(letters[1:4],c(1:4))

#기존 행렬에 열과 행 추가해봅시다.
x<-cbind(letters[1:4],c(1:4))
y<-rbind(letters[1:4],c(1:4))

cbind(x,5:6)

x1<-1:2
x2<-3:6
x3<-7
rbind(x1,x2,x3) #길이가 달라 순환법칙이 적용되었다는 것을 알 수 있습니다.

(2) 행렬의 연산

행렬과 행렬 연산과 행렬과 스칼라 연산으로 나누어집니다.

연산자 및 함수 기능
+ - * / ^ 행렬을 구성하는 숫자 각각에 적용
A %*%B 행렬 A와 행렬 B의 곱하기
cbind(A,B,...) 행렬이나 벡터를 열 단위로 결합
colMeans(A) 행렬 A 각 열의 평균값으로 구성된 벡터
crossprod(A) t(A)%*%A(ATA)
crospprod(A,B) t(A)%/%(ATB)
colSums(A) 행렬 A의 각 열의 합으로 구성된 벡터
diag(A)
diag(x)
diag(k)
행렬 A의 대각선 원소로 구성된 벡터
벡터 x의 대각선 원소로 하는 대각행렬
k*k 단위행렬
eigen(A) 행렬 A의 고유값과 고유벡터로 구성된 리스트
rbind(A,B,...) 행렬이나 벡터를 행 단위로 결합
rowMeans(A)
rowSums(A)
행렬 A 각 행의 평균값으로 구성된 벡터
행렬 A의 각 행의 합으로 구성된 벡터
solve(A)
solve(A,b)
행렬 A의 역행렬
연립방정식 Ax=b의 해
t(A) A의 전치(AT)행렬
tcrossprod(A)
tcrossprod(A,B)
A%*%t(A)
A%*%t(B)
dim() 차원 수 구함, 차원 수 지정
apply() apply(행렬,1,함수) #행 단위로 행렬에 함수 적용
apply(행렬,2,함수) #열 단위로 행렬에 함수 적용

간략히 계산이 어떻게 이루어지는지 알아봅시다. 사실 R이 다 계산해줄 것이기에, 계산방법을 모르고 넘어가도 좋습니다. 하지만 행과 열에 대한 것은 확실히 알고가면 좋습니다. 혹시 행과 열에 대한 것과 계산방법과  대해 알고싶다면 이어 글을 읽어주시고, 사용한 예를 보고싶다면 ctrl+F를 눌러 '사용한 예는 아래와 같습니다.'를 기입하여 바로 봐주시길 부탁드립니다.

 

○계산하는 방법을 알기 전에, 일단 행과 열에 대해 정리해봅시다.

2행 2열 행렬이 있다고 치면 이런식으로 이름지어집니다.

그럼 아래 A 행렬의 1행 1열은 1이 되는 것 입니다.

○행렬 A와 행렬 B의 곱하기(행렬의 곱)

조건이 있다면, A의 행의 개수와 B의 열의 개수가 맞아야 계산이 가능합니다.

계산하는 방법은 A 행렬의 1행 1열 곱하기 B 행렬의 1행 1열 더하기 A 행렬의 1행 2열 곱하기 B 행렬의 2행 1열를 하여서 1행 1열을 구하면 됩니다. 이렇게 2행 2열까지 구하면 계산이 됩니다.

○전치행렬 

전치행렬을 구할 때는 아래와 같이 T를 행렬 위에 붙여줍니다.

전치행렬을 구하게 되면 행은 열로, 열은 행으로 바뀌게 됩니다.

그러고 나면 결과는 아래와 같이 됩니다.

○고유값과 고유벡터

고유값을 구할 때는 아래와 같이 구하면 됩니다.

고유벡터를 구할 때는 아래와 같이 구하면 됩니다.

○차원의 수

열공간의 차원으로 보게 되면 저 빨간색 표시처럼 보게 됩니다.

그것이 (1,4,5) 한 묶음과 (2,3,6) 한 묶음해서 총 2개로 표시될 수 있습니다.

행 공간의 차원으로 보게 되면 (1,2) 한 묶음과 (4,3) 한 묶음과 (5,6) 한 묶음해서 총 3개로 표시될 수 있습니다.

 

사용한 예는 아래와 같습니다.

A<-matrix(c(1:6),nrow=2)
A+1
A-1
8-A
A/2
A+A
A-A
A/A
A*A
B=matrix(c(7:12),nrow=3)
A%*%B
colMeans(A)
t(A)
crossprod(A)
C=matrix(c(7:12),nrow=2)
crossprod(A,C)
colSums(A)
diag(A)
x=c(1,2,3,4)
diag(x)
diag(2)
D=matrix(c(1:4),ncol=2)
eigen(D)
rowMeans(A)
rowSums(A)
solve(D)
b<-c(1,4)
solve(D,b)
tcrossprod(D)
E=matrix(c(5:8),nrow=2)
tcrossprod(D,E)
dim(A)
nrow(A)
ncol(A)
A<-matrix(c(1:6),nrow=2)
A
apply(A,1,sum)
apply(A,2,sum)

#rowMeans()와 같은 함수는 apply() 보다는 자유도가 떨어집니다.

 

아래 발행 글

R-데이터 유형과 객체 간략히 살펴보기

728x90
반응형

'개인공부공간 > R' 카테고리의 다른 글

R-데이터 프레임  (4) 2021.06.04
R-데이터 유형과 객체 간략히 살펴보기  (16) 2021.06.02
Comments