1주차

 

R 기본 문법

install.packages("caTools")
library(caTools)
search()
install.packages("dplyr")
library(dplyr)

기본적으로 R에서 패키지를 설치하고 라이브러리로 해당 패키지의 함수를 불러오는 코드

 

내장 함수

help.start()
help(solve)
?solve
example(solve)
help.search("string)

R의 내장함수들의 사용법을 알기위한 명령어들이다.

 

R 기본 연산

X <- 3; y = 15
n <- 100
p = 50

할당 연산은 <- 또는 = 모두 사용 가능하다.


2주차

 

Type check and type casting

real <- 3.5
as.integer(real)
intg <- 3
is.integer(intg)

test <- c(TRUE,FALSE,TRUE)
is.logical(test)
as.numeric(test)
  • as를 활용하면 type casting, 즉 형변환이 가능하다.
  • is를 활용하면 type check가 가능하다. 반환형은 True, False

 

Vector

vec <- c(1, 3, 4, 2, 5)
vec

vec[7] = 5
vec

R에서 c() 함수를 활용하여 할당하면 기본적으로 벡터로 저장이 된다. 만약 위의 코드처럼 단일 type으로 할당하면 문제가 없다. 하지만 여러가지 type으로 벡터를 할당하면 type 우선순위에 따라 자동으로 type casting이 이뤄진다.

Type casting power는 char > integer > logical 순이다.

 

assign

assign("x", 1:10)
x

name = paste0("x", 1:200)
name

for(i in 1:200) {
    assign(name[i], 1:10)
}

assign함수는 말 그대로 변수에 값을 할당하는 함수다. 효율이 낮아서 자주사용하는 함수는 아니다. 흔히 쓰이는 경우는 위의 예제코드처럼 반복문을 통해 특정 규칙을 가진 변수를 할당할 때 사용한다. 근데 사실 이 마저도 paste0()함수를 활용하면 해결된다.

 

기본적인 수학적 함수 활용

x <- c(1,2,3, 1); y <- c(1,2,3,4)
v <- 2 * x + y + 1
print(v)

3 ^ 2 %% 4
3 * 2 %% 4

log(exp(1))

range(x)
sum(x)
prod(x)

var(x)
vari <- sum((x-mean(x))^2)/(length(x)-1)
print(vari)

complex(real=-17,imaginary = 0)
complex(3,1)
complex(3,10,-2)

기본적으로 사용 가능한 수학적 method들이다.

  • range()는 해당 벡터 데이터의 최대, 최소값 리턴
  • 그 외에 sum(), prod()는 순서대로 해당 변수의 전체 합, 전체 곱 리턴
  • 통계적인 데이터인 분산, 평균 등을 계산 가능하고 complex(real, imaginary)를 쓰면 복소수를 나타낼 수 있음

3주차

 

vector index naming

vec <- vector()
vec <- 1:10
vec2 <- c("abc", "def")
vec3 <- c(T,F,T,F)
names(vec2) <- c("first","second")
vec2["first"]

벡터의 인덱스에 이름을 부여할 수 있다. 인덱스에 이름이 부여되면 파이썬처럼 텍스트 인덱스를 쓸 수 있다.

 

Matrix (행렬)

x1 <- matrix(1:20,nrow=5,ncol=2,byrow=T)
x2 <- matrix(1:10,5,2,byrow = F)
print(x1)
print(x2)

cbind(x1,x2)
rbind(x1,x2)

A <- matrix(1:12,4,3)
rownames(A) <- c(paste0("n", 1:4))
colnames(A) <- c(paste0("x", 1:3))
print(A)

A[1,]
A[,2]
A[,-3]
B <- matrix(1,4,3)
A + B

a <- matrix(1:6,2,3); b <- matrix(1,3,2)
a%*%b
A <- matrix(1:4,2,2)
solve(A)

A <- matrix(1:12,4,3)
t(A)
A <- matrix(1:9,3,3)
sum(diag(A))

A <- matrix(1:4,2,2)
det(A)
eigen(A)$values

matrix()를 활용하면 행렬을 만들 수가 있다.

  • 이때 중요한 옵션은 byrow옵션이다. byrow의 default값은 FALSE이다.
    byrow가 TRUE인 경우는 행렬 데이터를 채울 때 행을 우선으로 채우고 FALSE인 경우 열을 우선으로 채우게 된다.
  • cbind(); rbind()는 두 행렬을 어떤 기준으로 이어 붙이는지를 결정해 준다.
    cbind()는 앞의 행렬에 뒤 행렬을 행기준으로 열을 붙이고 rbind()는 앞의 행렬에 뒤 행렬을 열기준으로 행을 붙인다.
    rownamescolnames를 활용하면 행과 열에 이름을 부여할 수 있다.
  • 인덱스를 정확한 좌표로 기록하지 않고 A[1,]과 같이 입력하면 해당 데이터의 1행을 모두 출력해준다.
    이때 인덱스에 -가 들어가면 해당 열, 혹은 행을 제외하고 출력해주는 명령어가 된다.
  • 기본 행렬 연산을 모두 지원한다. 간단한 행렬 합과 곱을 모두 지원하는데 당연하게 합, 곱 연산시의 기본 조건은 지켜야한다.
    A%*%B는 두 행렬의 곱연산을 나타내는데, 이때 반드시 지켜야하는 조건은 '앞의 열수 = 뒤의 행수'이다.
    만약 단순하게 A*B를 하면 두 행렬의 원소별 곱을 지원하기도 한다.
  • solve()는 역행렬을 반환해준다.
  • t()는 행렬의 transpose(전치)를 반환해준다.
  • diag()를 활용하면 대각행렬을 만들 수 있다.
    함수 내부에 어떤 값이 들어가냐에따라 역할이 달라진다.
    1. 숫자 -> n x n 단위행렬
    2. 벡터 -> 해당 벡터가 대각성분인 대각행렬
    3. 행렬 -> 해당 행렬의 대각성분 반환
  • det()를 활용하면 행렬의 determinant를 알려준다.
  • eigen()을 활용하면 eigen value혹은 eigen vector를 알 수 있기때문에 행렬의 고유값과 고유벡터를 알 수 있다.
    $연산자를 활용해서 values와 vectors를 각각 반환 가능하다.

 

list

lst1 = list(a = 1:10, b =matrix(1:4,2,2))
lst2 <- list()
lst2[[1]] <- matrix(1:10,5,2)
lst2[[2]] <- lst1

lst1$a
lst1$b

lst1[1]
lst1[[1]]
lst2[[1]]
lst2[[1]][3]
lst1[[2]]
lst1[2]
lst2[2]
lst2[1]
lst2[[2]][[1]]

R에서 다양한 데이터를 한꺼번에 담을 수 있는 가장 포괄적 객체이다. 모든 객체를 담을 수 있으며 동시에 다양한 type으로 담을 수 있다. 변수 이름을 부여해서 데이터를 관리할 수도 있으며 데이터 저장인덱스를 불러올 수도 있다.

 

factor type

grade <- c("A", "A", "B", "C", "B", "B")
f.grade <- factor(grade)

f2.grade <- factor(grade, order = T)
lev <- c("C", "B", "A")

f3.grade <- factor(grade, levels = lev, order = T)
levels(f2.grade)
levels(f3.grade)

범주형 자료분석에 유용한 객체이다. 보통 명목형, 순서형자료에 사용한다.

  • level을 가지고 있기때문에 순서를 구분이 가능하다.
  • factor생성할 때, order이 T인 경우 순서형, F인 경우 명목형으로 저장한다.
  • 얼핏 보면 벡터와 굉장히 유사한 것을 알 수 있지만 factor는 지정된 인덱스를 벗어난 값은 접근이 불가능하다.

 

data.frame

x1 = 1:4; x2 <- c("kim","lee","jung","park")
dat = data.frame(x1,x2)
dat2 = data.frame(num=x1, name=x2)
dat3 = data.frame(x1,x2,stringsAsFactors = F)

dat[1]; dat[2]
dat[[1]]; dat[[2]]

data.frame은 행렬과 리스트가 합쳐진 것이라 생각하면 편하다.

  • 데이터프레임에 저장할 변수는 길이가 동일해야한다.
    다르면 계속해서 에러가 난다.
  • 조심해야하는 점이 한 가지 있다.
    숫자를 다루게 될 경우 문자와 섞이게 되거나, 문자로 적힌 숫자인 경우에는 문자로 인식해서 factor타입으로 변형을 시키게되는데, 이때 이 값으로 연산을 하면 값으로 계산을 하는 게 아니라 factor에 있는 level로 계산을 하게 된다.
    이를 막기 위해서 stringsAsFactors = F를 이용하면 막을 수 있다.

 

array

x1 <- array(1:24, dim=c(4,3,2))
x2 <- array(1:32, dim=c(2,2,4,2))

n차원의 데이터 저장방법이다. 행렬과 유사한 형태이다. dim을 통해서 n x m과 높이, 반복수 등을 정할 수 있다.

정확하게 말하면 반복보다는 차원의 개수를 지정해준다. 3차원 직육면체 큐브를 몇개 만들 것인가 지정해준다고 생각하면 편하다.
위의 코드로 예시를 들면 (상상하시길)

  • 1번 코드는 1~24를 저장하는 행렬을 배열로 만든다. 이때, 행렬의 기본 형식을 4x3이고 큐브의 층은 2층이다.
  • 2번 코드는 1~32를 저장하는 행렬을 배열로 만든다. 행렬의 기본 형식은 2x2이고 층수는 4개이다. 
    이런 직육면체 큐브를 2개를 만들면 된다.

 

apply

x_mat <- matrix(rnorm(100), 20, 5)
x_mat

apply(x_amt, 2, mean)
apply(x_mat, 1, sum)

apply는 반복문의 사용을 극도로 줄여준다. 1을 사용하면 모든 행, 2를 사용하면 모든 열에 함수를 적용시킨다.

반응형