배열


d<- data.frame()
배열/데이터프레임/테이블 만들기

drop=FALSE 테이블형태를 유지하게 할때

테이블형태 그대로 테이블 추출
    > (d<-data.frame(a=1:3, b=4:6, c=7:9))
       a b c
    1 1 4 7
    2 2 5 8
    3 3 6 9
    > d[,names(d) %in% c("b","c")]
       b c
    1 4 7
    2 5 8
    3 6 9
    > d[, !names(d) %in% c("b")]
       a c
    1 1 7
    2 2 8
    3 3 9

 

데이터 많을 때, 일부 위쪽 %개 추출
> head(데이타프레임 이름,원하는 개수)
> tail : 뒤쪽
> View(데이타프레임 이름) : 위쪽 창에 테이블/표 형태로

 

class(x) : x의 클래스
str(x) : x의 구조
is.factor(x) : x가 팩터냐?
is.numeric(x) : x가 숫자냐?
is.character(x) : x가 문자열이냐?
is.matrix(x) : x가 행렬이냐
is.array(x)
is.data.frame(x)

 

drop=FALSE 데이터 변환하지 않는다.
> stringAsFactor=FALSE : 문자열을 팩터로 인식하게 함
as.factor(x) : x를 팩터로 변환
as.numerix(x) ....... character, matrix, array, data.frame 등등

 

제어/조건/반복문

 

제어문 : if, ifelse
반복문 : for, while, repeat
연산 : 사칙연산, 논리연산
함수 : 반복적인(자주 사용되는) 기능을 수행하는 명령어들의 묶음

> x <- c(1:8)
[1] 1 2 3 4 5 6 7 8
> ifelse(x%%2==0,"짝수","홀수")
[1] "홀수" "짝수" "홀수" "짝수" "홀수" "짝수" "홀수" "짝수"
>

 

for(i in 10:20){
 print(i)
} : 자동으로 i 1씩 증가, 10~20까지 i 프린트

 

while(조건<=20){
 print(i)
 i<- i+1
} : 조건에 만족할 때까지, i프린트, i에 i+1 대입

 

repeat{
 반복~~
 if(조건){
  break
 }
 i<- i+1
}


수치연산


 - 사칙연산, 나머지, 몫, 지수, 로그, 삼각함수 등

나머지
    > 5%%3
    [1] 2

    > 5%/%3
    [1] 1

제곱근
    > 2^3
    [1] 8

지수
    > exp(3)
    [1] 20.08554

로그
    > log2(8)
    [1] 3
    > log10(100)
    [1] 2
    > sin(1/2)
    [1] 0.4794255
    > cos(1/2)
    [1] 0.8775826
    > tan(1/2)
    [1] 0.5463025

연산 순서

    > 1:3 * 5+10
    [1] 15 20 25
        ->먼저 1부터3에 5를 곱해서 5, 10, 15, +10, 15 20 25
    > x<-c(1,2,3)
    > x*5
    [1]  5 10 15
        ->x 전체에 5가 곱해진다
    > a<-c(2,4,6,8,10)
    > a+a
    [1]  4  8 12 16 20
    > a==a
    [1] TRUE TRUE TRUE TRUE TRUE


각각에 대한 데이터 단위로 비교
    > a==c(1,2,3,4,10)
    [1] FALSE FALSE FALSE FALSE  TRUE
    > c(T,T)&c(T,F)
    [1]  TRUE FALSE
        ->True와 True = True, True와 False = False
    > x<-c(1,8,9,10,11)
    > sum(x)
    [1] 39
    > mean(x)
    [1] 7.8
    > median(x)
    [1] 9
        -> 중앙값이 홀수일 때는 가운데 수, 짝수일 때는 중앙 2개 평균
    > x<-c(1,2,8,9,10,11,100000)
    > mean(x)
    [1] 14291.57
    > median(x)
    [1] 9
        -> mean과 median의 차이가 큰, 유의


    > (x <- c(1,2,3,4,5))
    [1] 1 2 3 4 5
    > ifelse(x%%2==0,"even","odd")
    [1] "odd"  "even" "odd"  "even" "odd"


    > a<-data.frame(x=c(1,2,3), y=c("a","b","c"))
    > a
       x y
    1 1 a
    2 2 b
    3 3 c


    > a[c(TRUE,TRUE,FALSE),]
       x y
    1 1 a
    2 2 b
        ->True, True, False인 마지막 줄 탈락 참조


    > a[a$x%%2==0,]
       x y
    2 2 b
        ->a의 x열 값을 2로 나누었을 때 나머지 값이 0인 경우만 참조


NA처리


NA(Not Available)
: 값이 기록되어 있지 않은 경우, 관측되지 않은 경우 // 결측치
ex) 시험
a : 80, b : 0, c : 50, d : 결시(NA)
    > 1+1
    [1] 2
    > 1+NA
    [1] NA
    > TRUE & NA
    [1] NA
        -> 데이터 속에 NA가 포함되면, 결과는 무조건 NA다.

    > sum(c(1,2,NA))
    [1] NA
    > sum(c(1,2,NA), na.rm = TRUE)
    [1] 3
        -> na.rm = TRUE = na를 제거하겠다 remove

 

    > a<- data.frame(x=c(1,2,3), y=c("i","j",NA), z=c("h","i",NA))
    > a
      x    y    z
    1 1    i    h
    2 2    j    i
    3 3 <NA> <NA>
    > na.fail(a)
    Error in na.fail.default(a) : 객체안에 결측값들이 있습니다

 

    > na.omit(a)
      x y z
    1 1 i h
    2 2 j i


    > na.exclude(a)
      x y z
    1 1 i h
    2 2 j i
        -> NA가 있는 행은 삭제하라 함수, omit, exclude

  

        -> omit과 exclude의 차이점 : 
    > df<- data.frame(x=1:10, y=seq(1,19,2))
    > df
        x  y
    1   1  1
    2   2  3
    3   3  5
    4   4  7
    5   5  9
    6   6 11
    7   7 13
    8   8 15
    9   9 17
    10 10 19


    > df[5,2] <- NA
    > df
        x  y
    1   1  1
    2   2  3
    3   3  5
    4   4  7
    5   5 NA
    6   6 11
    7   7 13
    8   8 15
    9   9 17
    10 10 19
        -> linear 모델을 만들 때(값을 예측할 때 쓰임)


    > resid(lm(y~x,data=df,na.action = na.omit))
                1             2             3             4             6 
     2.737814e-15 -2.647896e-15 -1.707033e-16 -1.025825e-16 -1.883857e-16 
                7             8             9            10
    -3.423096e-16 -5.214426e-17  2.380211e-16  5.281864e-16
    > resid(lm(y~x,data=df,na.action = na.exclude))
                1             2             3             4             5 
     2.737814e-15 -2.647896e-15 -1.707033e-16 -1.025825e-16            NA 
                6             7             8             9            10
    -1.883857e-16 -3.423096e-16 -5.214426e-17  2.380211e-16  5.281864e-16 
        ->5의 여부 // 자세한 것은 나~중에

 

> na.pass(a)
  x    y    z
1 1    i    h
2 2    j    i
3 3 <NA> <NA>

 

함수(function)


자주 반복되어 사용되는 특정 기능을 정의
출력기능(50줄 코드) -> 간편하게
종류 :
 R시스템에서 제공하는 함수
 사용자 정의 함수

함수 정의
함수 이름 <- function(인수,인수){ // 인수 없을 수도, 하나일 수도 ~
 함수 코드
 return(반환값) // return이 없을 수도
}

예제)


    > hap <- function(n){
    +     res <- 0
    +     for(i in 1:n){
    +         res<- res+i
    +     }
    +     return(res)
    + }
    > hap(5)
    [1] 15

 

    > myfact<- function(n){
    +     if(n==0){
    +         return(1)
    +     }
    +     res <-1
    +     for(i in 1:n){
    +         res<- res *i
    +     }
    +     return(res)
    + }
    > myfact(5)
    [1] 120
    > myfact(0)
    [1] 1

 

    > f <- function(a,b){
    +     print(a)
    +     print(b)
    + }
    > f(10,20)
    [1] 10
    [1] 20
    > f(b=10,a=20)
    [1] 20
    [1] 10

 

가변 인수 함수


인수의 개수가 변하는
표현 : (...) 점 3개
    > f2 <- function(...){
    +     myArgs <- list(...)
    +     for(i in myArgs){
    +         print(i)
    +     }
    + }
    > f2(1,2,3,4)
    [1] 1
    [1] 2
    [1] 3
    [1] 4
    > f2("!","G")
    [1] "!"
    [1] "G"
        -> 인수의 개수 상관없이 다 받아진다.

 

중첩 함수


함수 내에 또 다른 함수가 정의되어져 있는 함수
    > f2 <- function(a,b){
    +     print(a)
    +     g2<-function(b){
    +         print(b)
    +     }
    +     g2(b)
    + }
    > f2(10,20)
    [1] 10
    [1] 20

 

    > f3 <- function(a,b){
    +     print(a)
    +     g3(b)
    +     g3<-function(b){
    +         print(b)
    +     }
    + }
    > f3(10,20)
    [1] 10
    Error in f3(10, 20) : could not find function "g3"
        -> 인터프리터, g3함수 정의가 g3함수 선언 다음에 있어서 실행안된다.

 

    > f4<-function(x1){
    +     return(function(x2){
    +         return(x1+x2)
    +     })
    + }
    > g <- f4(1)
    > g(2)
    [1] 3
    >

 

 

  

* R 초기 환경 만들기 / 설치

 

http://cran.r-project.org/

- 반드시 R을 먼저 설치한 후

https://www.rstudio.com/

- R 스튜디오를 설치해야 충돌이 없다!

https://www.java.com/ko/

- 각종 라이브러리를 위해서는 자바의 설치를 미리 해놓는 것이 좋다.

 

* 변수

 

- 알파벳, 숫자, 언더바, .(점) 가능

k, i, x2, .y (가능)

- 하이픈, 점 뒤에 숫자 불가능
    1k, .3, k-j (불가능)

변수 할당
<-, <<-, =
    x <-2, y<-c(1,2)

=보다는 <-가 더 쉽고 자주 쓰인다. / =는 최상위에서만

 

* 스칼라 데이터


1차원 값(1,2,3 등)
r에서 기본 데이터 타입은 벡터(배열), 스칼라 데이터는 길이가 1인 벡터
숫자, null, na, 문자열, 진리값(참/거짓), 팩터
Null(초기화 되지 않은 변수)
NA(Not available) : 결측치

문자열은 'ㅇㅇ', "ㅇㅇ"
진리값 TRUE/FALSE, 논리연산자를 이용해서 연산 가능(&, |, !)
&&, || : 벡터단위 연ㅅ나을 하기 위한것이 아닌, 두개의 진리값끼리 연산하기 위한 연산자
&, | : 진리값이 저자된 벡터값

 

* 팩터(factor)

 

범주형 데이터를 미리 정해진 유형으로 분류
좋음, 보통, 나쁨 등과 같이 레벨 (level)
명목형 : 데이터 간 크기 비교가 불가능
순서형 : 데이터 간 순서 둘 수 있는 경우

수치형 : 데이터를 숫자로 표현

팩터 함수

setequal 같은 집합인지?
setdiff 차집합
intersect 교집합
union 합집합
identical 객체가 동일한지?

seq : 연속된 값으로 벡터를 초기화
    > seq(3,5)
    [1] 3 4 5
    > seq(0,10,5)
    [1]  0  5 10
    > seq(1,10,3)
    [1]  1  4  7 10

seq_along : 길이만큼의 연속된 값으로 벡터를 초기화

*개수 셀 때 좋을듯
    > seq_along(c("1","3","55","7777","412"))
    [1] 1 2 3 4 5

rep : 값을 반복
    > rep(1:3,times=5)
     [1] 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3
    > rep(1:3,each=3)
     [1] 1 1 1 2 2 2 3 3 3
    > rep(1:3,each=2, time=3)
     [1] 1 1 2 2 3 3 1 1 2 2 3 3 1 1 2 2 3 3

 

* 리스트

 

서로 다른 데이터 타입의 데이터들이 연결되어 있는 구조 // 자바에서 해쉬맵과 비슷하다
데이터 (key, value)

변수$key : 해당 key의 value
변수[n] : n번째 데이터 리스트
변수[[n]] : n번째 데이트만

리스트 안에 리스트 저장 가능

 

* 행렬


벡터처럼 한 가지 유형의 스칼라 값들이 저장
matrix 함수 : 행렬을 생성
dimnames 함수 : 각각의 차원에 해당하는 이름을 리턴, 부여
rownames 함수 : 행 이름을 리턴, 부여
colnames 함수 : 열
    > matrix(c(1,2,3,4), nrow=2)
         [,1] [,2]
    [1,]    1    3
    [2,]    2    4
    > matrix(c(1,2,3,4), nrow=2, byrow = T)
         [,1] [,2]
    [1,]    1    2
    [2,]    3    4
    > matrix(1:4, nrow=2, dimnames = list(c("r1","r2"), c("c1","c2")))
       c1 c2
    r1  1  3
    r2  2  4

> s3<- matrix(1:9, ncol=3)
> s3
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9
> dimnames(s3) <- list(c("a1","a2","a3"), c("b1","b2","b3"))
   b1 b2 b3
a1  1  4  7
a2  2  5  8
a3  3  6  9

> 행렬 %*% solve(행렬)
     [,1] [,2]
[1,]    1    0
[2,]    0    1

 

 

 

+ Recent posts