Ruser

R 프로그래밍 기초 본문

R basic

R 프로그래밍 기초

swub 2018. 12. 7. 20:53

Introduce R

  • R 프로그래밍 언어
    1. R은 통계 계산과 그래픽을 위한 프로그래밍 언어이자 소프트웨어 환경이다.
    2. 뉴질랜드 오클랜드 대학의 로스 이하카와 로버트 젠틀맨에 의해 시작되어 현재는 R 코어팀이 개발하고 있다.
    3. R은 GPL(General Public License)하에 배포되는 S프로그래밍 언어로 구현되어 GNU S라고 한다.
  • R의 특징
    1. 표준 플랫폼(S 언어 기반)
    2. 모든 운영체제에서 사용 가능(맥, 리눅스, 윈도우)
    3. 메모리 저장방식
    4. 객체지향언어이며 함수형 언어
    5. 오픈소스 프로그램으로 무료
  • 통계분석도구의 비교
SASSPSS오픈소스 R
프로그램 비용유료, 고가유료, 고가오픈소스, 공짜
설치용량대용량대용량모듈화로 간단
다양한 모듈 지원 및 비용별도구매별도구매오픈소스
최근 알고리즘 및 기술반영느림다소느림매우빠름
학습자료 입수의 편의성유료 도서 위주유료 도서 위주공개 논문 및 자료 많음
질의를 위한 공개 커뮤니티NANA매우 활발

Basic of R

  • 작업환경 설정

    # 작업환경 경로 설정
    setwd("/home/.../r/basic")
    # 작업환경 경로 확인
    getwd("/home/.../r/basic")
  • R 패키지 사용

    # 원하는 패키지(stringr)을 설치한다.
    install.packages("stringr") # install.packages()를 사용할 때는 패키지 이름에 ""을 써야한다.
    # 설치되어있는 패키지를 불러와서 사용한다.
    library(stringr)
    # 패키지에 대한 설명을 웹상에서 보여준다.
    help(stringr)
  • 변수(객체) 생성 및 제거

    # x라는 변수에 객체 100을 저장
    x <- 100
    # y라는 변수에 객체 a,b,c를 저장
    y <- c("a","b","c")
    # 객체 출력
    print(x) # print는 한번에 하나의 변수값만 출력가능하다.
    ## [1] 100
    cat(x,y) # cat은 여러개의 변수를 한번에 출력 가능하다.
    ## 100 a b c
    # 변수목록 확인
    ls() # 현재 생성된 변수 목록
    ## [1] "x" "y"
    rm(x) # 변수 x 삭제
    ls() # x가 삭제됨
    ## [1] "y"
  • R 함수 만들기

    # kim,jo와 park의 영어,수학 성적
    name <- c("kim", "jo", "park")
    english <- c(80, 85, 90)
    math <- c(60, 75, 100)
    grade <- cbind(name, english, math) #name,english와 math를 열로 결합된 행렬 생성
    class(grade)
    ## [1] "matrix"
    grade <- data.frame(name,english,math) #name,english와 math이 열로 결합된 dataframe 생성
    class(grade)
    ## [1] "data.frame"
    # 평균을 구하는 mean이라는 base함수가 있지만 쉬운 예시를 위해 평균에 대한 함수생성
    # 각각의 평균에 대한 함수 생성
    M <- function(data=grade, who="kim"){
      idx <- which(grade$name==who)
      M <- mean(grade$english[idx], grade$math[idx])
      M
    }
    
    # 함수를 사용하여 각각의 평균 구하기
    M(grade, "kim") #kim의 평균
    ## [1] 80
    M(grade, "jo") #jo의 평균
    ## [1] 85
    M(grade, "park") #park의 평균
    ## [1] 90
  • R base 코드: 변수 생성

    # c(): 문자,숫자,논리값 객체 또는 변수들을 결합하여 변수 생성
    x <- c(1,2,3,4)
    y <- c(1.5, 2.5, 3.5)
    z <- c("kim", "jo", "park")
    t <- c(x,y,z) #변수 x,y,z를 하나의변수로 합침
    print(t)
    ##  [1] "1"    "2"    "3"    "4"    "1.5"  "2.5"  "3.5"  "kim"  "jo"   "park"
    # 수열 생성
    x <- 1:5 #1부터 5까지 저장
    print(x)
    ## [1] 1 2 3 4 5
    y <- seq(from=1, to=5, by=1) #1부터 5까지 1 간격으로 나열함
    print(y)
    ## [1] 1 2 3 4 5
    z <- seq(from=1, to=5, by=0.1) #1부터 5까지 0.1 간격으로 나열함
    print(z)
    ##  [1] 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2.0 2.1 2.2 2.3 2.4 2.5 2.6
    ## [18] 2.7 2.8 2.9 3.0 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 4.0 4.1 4.2 4.3
    ## [35] 4.4 4.5 4.6 4.7 4.8 4.9 5.0
    # 반복
    x <- rep(1, time=5) #1을 5번 반복하여 x에 저장
    print(x)
    ## [1] 1 1 1 1 1
    y <- rep(1:4, each=2) #1부터 4까지 각각 2번씩 반복 나열
    print(y)
    ## [1] 1 1 2 2 3 3 4 4
    # 행렬 만들기
    x <- 1:9
    matrix(x, 3, 3, byrow=T) #변수 x를 3X3 행렬로 만듬 (byrow=T : 행으로 입력)
    ##      [,1] [,2] [,3]
    ## [1,]    1    2    3
    ## [2,]    4    5    6
    ## [3,]    7    8    9
    matrix(x, 3, 3, byrow=F) #변수 x를 3X3 행렬로 만듬 (byrow=T : 열로 입력)
    ##      [,1] [,2] [,3]
    ## [1,]    1    4    7
    ## [2,]    2    5    8
    ## [3,]    3    6    9
  • R base 코드: 기초통계

    x <- c(1:10)
    y <- c(11:20)
    mean(x) # 변수의 평균
    ## [1] 5.5
    sum(x) #변수의
    ## [1] 55
    median(x) #변수의 중앙값
    ## [1] 5.5
    log(x) #변수의 로그값
    ##  [1] 0.0000000 0.6931472 1.0986123 1.3862944 1.6094379 1.7917595 1.9459101
    ##  [8] 2.0794415 2.1972246 2.3025851
    sd(x) #변수의 표준편차
    ## [1] 3.02765
    var(x) #변수의 분산
    ## [1] 9.166667
    cov(x,y) #변수간의 공분산
    ## [1] 9.166667
    cor(x,y) #변수간의 상관계수
    ## [1] 1
    length(x) #변수의 길이
    ## [1] 10
  • R base 코드: 변수 다루기

    a <- matrix(1:6, 2,3)
    dim(a) #행렬 a이 몇행 몇열인지를 보여준다
    ## [1] 2 3
    diag(a) #행렬 a의 대각원소
    ## [1] 1 4
    t(a) #행렬 a의 전치행렬
    ##      [,1] [,2]
    ## [1,]    1    2
    ## [2,]    3    4
    ## [3,]    5    6
    b <- matrix(c(2,3,4,1), 2,2) #2X2의 정방행렬 생성
    solve(b) #행렬 b의 역행렬
    ##      [,1] [,2]
    ## [1,] -0.1  0.4
    ## [2,]  0.3 -0.2
    b %*% a #행렬의 곱은 %*%으로 나타낸다
    ##      [,1] [,2] [,3]
    ## [1,]   10   22   34
    ## [2,]    5   13   21
    rownames(a) <- c("1행","2행") #행렬a의 행의 이름 생성
    colnames(a) <- c("1열","2열","3열") #행렬a의 열의 이름 생성
    print(a)
    ##     1열 2열 3열
    ## 1행   1   3   5
    ## 2행   2   4   6
    rownames(a)
    ## [1] "1행" "2행"
    colnames(a)
    ## [1] "1열" "2열" "3열"
    grade[1,1] # 데이터프레임 grade의 1행 1열
    ## [1] kim
    ## Levels: jo kim park
    grade$name # 데이터프레임 grade의 name 변수값
    ## [1] kim  jo   park
    ## Levels: jo kim park
    subset(grade, select=name) # 데이터프레임 grade의 name 변수값
    ##   name
    ## 1  kim
    ## 2   jo
    ## 3 park
    grade[1,] # 데이터프레임 grade의 1행
    ##   name english math
    ## 1  kim      80   60
    subset(grade,  name=="kim") # 데이터프레임 grade에서 name이 "kim"인 행
    ##   name english math
    ## 1  kim      80   60
    dfm1 <- data.frame(name, english)
    print(dfm1)
    ##   name english
    ## 1  kim      80
    ## 2   jo      85
    ## 3 park      90
    dfm2 <- data.frame(name, math)
    print(dfm2)
    ##   name math
    ## 1  kim   60
    ## 2   jo   75
    ## 3 park  100
    merge(dfm1, dfm2, by="name") # dfm1과 dmf2를 동일변수 name으로 결합
    ##   name english math
    ## 1   jo      85   75
    ## 2  kim      80   60
    ## 3 park      90  100
  • R base 코드: 데이터 구조 변환

    as.character() #자료형을 character로 변환
    as.numeric() #자료형을 numeric으로 변환
    as.double() #자료형을 doublue로 변환
    as.integer() #자료형을 integer로 변환
    as.logical() #자료형을 logical로 변환
    as.data.frame() #자료형을 dataframe으로 변환
    as.list() #자료형을 list로 변환
    as.matrix #자료형을 matrix로 변환
    as.vector #자료형을 vector로 변환
    unlist() #list형 자료를 벡터로 변환
  • R base 코드: 기타

    data(iris) #R 내장데이터인 iris 불러오기
    summary(iris) #iris 내용 요약, 각 변수의 분위수,평균,중위수
    ##   Sepal.Length    Sepal.Width     Petal.Length    Petal.Width   
    ##  Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100  
    ##  1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300  
    ##  Median :5.800   Median :3.000   Median :4.350   Median :1.300  
    ##  Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199  
    ##  3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800  
    ##  Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500  
    ##        Species  
    ##  setosa    :50  
    ##  versicolor:50  
    ##  virginica :50  
    ##                 
    ##                 
    ## 
    head(iris) #iris데이터의 상위 6개만 표현
    ##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
    ## 1          5.1         3.5          1.4         0.2  setosa
    ## 2          4.9         3.0          1.4         0.2  setosa
    ## 3          4.7         3.2          1.3         0.2  setosa
    ## 4          4.6         3.1          1.5         0.2  setosa
    ## 5          5.0         3.6          1.4         0.2  setosa
    ## 6          5.4         3.9          1.7         0.4  setosa
    round(3.333,1) #소수점 1번째 자리까지 표시 2번째 에서 반올림
    ## [1] 3.3
    round(3.366,1)
    ## [1] 3.4
    lapply(iris$Sepal.Length[1:3], function(x){round(x)}) #함수의 결과를 리스트형식으로 출력
    ## [[1]]
    ## [1] 5
    ## 
    ## [[2]]
    ## [1] 5
    ## 
    ## [[3]]
    ## [1] 5
    sapply(iris$Sepal.Length[1:3], function(x){round(x)}) #함수의 결과를 벡터형식으로 출력
    ## [1] 5 5 5
  • R base 코드: 문자열 다루기

    nchar("이단어의문자길이가몇개일까") #문자열길이
    ## [1] 13
    paste("a","b","c",sep=",") # a,b,c를 ","로 붙임
    ## [1] "a,b,c"
    paste0("a","b","c") #a,b,c를 붙임 paste에서 sep이 ""인것과 같다
    ## [1] "abc"
    substr("UniversalBank", 1,4) #UniversalBank의 1번째 부터 4번째까지의 문자 추출
    ## [1] "Univ"
    strsplit("벌써 11시 30분이네", split = " ") # 구분자(split)를 기준으로 나눠줌
    ## [[1]]
    ## [1] "벌써"     "11시"     "30분이네"
    sub("바나나", "사과", "바나나는 빨개요") # sub(old,new,string) string에서 old를 new로 바꾸어줌
    ## [1] "사과는 빨개요"
    gsub("바나나", "사과", c("바나나는 빨개요", "아침 바나나")) # 한번에 적용
    ## [1] "사과는 빨개요" "아침 사과"