- R언어는 객체지향 언어 : 데이터 / 함수로 객체가 구분됨.
- 함수의 종류 1 : 사용자 지정 함수 (여기서는 사용 안함)
- 함수의 종류 2 : 패키지 내부 함수
- 데이터의 종류 : 구조적 관점
- 데이터의 종류 : 타입의 관점
- 처음 불러올 때 data.frame()
- 이때 data.frame() 안 원소의 타입은 factor
- 엑셀에서 데이터를 받아올 때 : 패키지 활용
데이터를 불러오고 나서 필요한 것 : 인덱싱
a[1:3]- 인덱싱 팁
- 콤마(,)는 차원으로 해석함
- 복합 인덱싱 :
- x = c(1, 2, 3)
- y = c(”F”, “F”, “M”)
- y[x ≤ 3]
- 이때 x와 y의 갯수가 안 맞으면 에러가 발생함.
재사용 (Recycle)
r
x = c(1,2,3)
y = c(3,1)
x+y
r
> x = c(1,2,3)
> y = c(3,1)
>
> x+y
[1] 4 3 6
Warning message:
In x + y : longer object length is not a multiple of shorter object length
벡터나 행렬을 자주 쓰고, 데이터프레임으로 불러올 계정
벡터에 이름 붙이기 : 최대한 영어로.
꼭 저장하기.
\begin{array} {r|rr}
&var. \\ \hline
obj. & x11 & x21\\
& x12 & x22\\
\end{array}
행렬
- 행렬에 수를 넣을 때는 column 순서로 들어간다.
- row 순서 : byrow = T
- 행렬 계산하기
factory[ , ]factory[1, -1]factory[ , c(T, F)]: 열의 갯수에 따라 맞춰 준 것.
- 행렬곱
- 행과 열을 잘 맞추어 곱하기 :
%*%
- 행과 열을 잘 맞추어 곱하기 :
- 전치
- 행렬식 :
det(A) diag(A)- 대각원소를 뽑기
diag(c(1,2,3))- 정방행렬. 주대각선이 1, 2, 3.
diag(3)- 단위행렬. 3x3
diag(factory) = c(35, 3)- 주대각선을 바꾸기
solve(factory)- 역행렬
행렬의 이름
rownames()colnames()
apply() 계열 함수
apply(): 행렬 대상lapply(): 리스트 대상sapply(): 임의의 함수를 가지고 적용. (고급 문법)
예제
r
> ? matrix
> A.mat = t(matrix(seq(1, 9, 1), 3, 3))
> rowSums(A.mat)
[1] 6 15 24
> apply(A.mat, 1, sum)
[1] 6 15 24
> apply(A.mat, 2, mean)
[1] 4 5 6
>
데이터 프레임
- 행렬과 리스트의 하이브리드
- 행렬의 연산을 거의 모두 데이터 프레임에 적용할 수 있다.
eigen
리스트에 접근하는 것이 필요하다.
r
> x$values
[1] 1.611684e+01 -1.116844e+00 -1.303678e-15
> x[[2]]
[,1] [,2] [,3]
[1,] -0.2319707 -0.78583024 0.4082483
[2,] -0.5253221 -0.08675134 -0.8164966
[3,] -0.8186735 0.61232756 0.4082483
정규 표현식
- 자연어 처리를 위한 도구
조건식
r
# 스칼라
x = -3
if (x >= 0) {
x} else if (x==0) {
-x} else {
-x}
# 벡터의 경우 ifelse()
x = c(-3, 3, 0)
ifelse(x >= 0, x, -x)
ifelse(x>0, x, ifelse(x==0, 0, -x))
# 벡터에 그냥 if()를 쓰려면 원소별로 접근해야 한다.
반복문(iteration) : if문
- 새로운 변수를 넣을 때 사용한다.
r
# 반복문
b = c("a", "b", "c", "d", "e", "f", "g", "h", "i")
b.mat = matrix(b, 3, 3)
b.mat
datas = data.frame(A.mat[,1], b.mat[,1],
A.mat[,2], b.mat[,2],
A.mat[,3], b.mat[,3])
names(datas) = paste("V", 1:6, sep="")
datas
for (j in seq(1, 6, by=2)){
datas[,ncol(datas)+1] = datas[,j]-mean(datas[,j])
}
datas
names(datas[7:9]) = paste(names(datas)[seq(1, 6, by=2)], ".cent", sep="")
datas
round()
round(vector, 3)
벡터화
두개의 길이가 같은 벡터 더하기
- 굳이 for 루프를 하지 않아도 더할 수 있음.
- 단, 길이가 맞는 지 꼭 확인!
로그와 절댓값
r
x = seq(1, 10, 2)
log(x)
abs(x)
r
> x = seq(1, 10, 2)
> log(x)
[1] 0.000000 1.098612 1.609438 1.945910 2.197225
> abs(x)
[1] 1 3 5 7 9
rep()
r
> rep(c(1, 4), each=3, times=2)
[1] 1 1 1 4 4 4 1 1 1 4 4 4
replicate()
r
# replicate : 지수분포
sample.means = vector(length=1000)
for (i in 1:length(sample.means)){
sample.means[i] = mean(rexp(1000), rate=1)
}
hist(sample.means)
실제로 코드를 짜서 그래프를 그려보면 다음과 같다.
중심극한정리의 증명이라고 할 수 있다.
r
# replicate : 균등분포
sample.means = vector(length=1000)
for (i in 1:length(sample.means)){
sample.means[i] = mean(~~~~(1000), rate=1)
}
hist(sample.means)