열렬히.뛰기

R언어 팁 정리

수학 & 통계 > 탐색적 자료분석 > R언어 팁 정리

  • 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)