내장함수, 변수 타입과 데이터 구조

R 내장 함수로 데이터 추출하기

  • dplyr 패키지를 사용하지 않고 R 내장 함수만 사용해도 데이터를 추출할 수 있다.
  • dplyr이 내장 함수에 비해 사용하기 쉽고 처리 속도도 빠르다. 하지만 다른 사용자들의 코드를 이해하기 위해 내장함수도 알아야 한다.
  • 내장 함수는 다른 함수들과 조합해 활용할 수 있다.

행 번호로 행 추출하기

  1. 데이터 준비

     exam <- read.scv("csv_exam.csv")
    
  2. 내장 함수는 프레임명 뒤에 []로 조건을 입력한다
    • 아무 조건이 없으면 전체 데이터를 출력
     exam[]
    
  3. 조건 지정
    • 쉼표 왼쪽 : 행에 대한 조건
    • 쉼표 오른쪽 : 열(변수)에 대한 조건
     exam[1,]    # 1행 추출
       id class math english science
     1  1     1   50      98      50
    
     exam[2,]    # 2행 추출
       id class math english science
     2  2     1   60      97      60
    

조건을 충족하는 행 추출하기

  1. 조건에 맞는 행 추출

     exam[exam$class == 1,]  # class가 1인 행
     exam[exam$math >= 80,]  # 수학 점수가 80점 이상인 행
    
  2. &, |를 사용해 하나이상의 조건지정

    • 내장 함수에서는 조건을 입력할 때 변수명 앞에 데이터 프레임 이름을 반복해 써야 한다
     exam[exam$class == 1 & exam$math >= 50,]        # 1반 이면서 수학 점수가 50점 이상
     exam[exam$english < 90 | exam$science < 50,]    # 영어가 90 미만이거나 과학이 50 미만
    

변수명으로 변수 추출하기

  • 데이터에 변수가 많으면 인덱스 값을 알아내기 힘들기 때문에 변수를 추출할 때는 변수명을 활용한다.
  • 변수명 추출 : 쉼표 오른쪽에 따옴표와 함께 변수명을 입력

      exam[, "class"]     # class 변수 추출
      exam[, "math"]      # math 변수 추출
    
  • c()를 이용해 여러 변수 동시에 추출 가능

      exam[,c("class","math","english")]
    

행, 변수 동시 추출하기

  • 쉼표 양쪽에 조건을 입력

      exam[1,3]                                           # 행, 변수 모두 인덱스
      exam[5, "english"]                                  # 행 인덱스, 열 변수명
      exam[exam$math >= 50, "english"]                    # 행 부등호 조건, 열 변수명
      exam[exam$math >= 50, c("english", "science")]      # 행 부등호 조건, 열 변수명
    

dplyr과 내장 함수의 차이

  • 수학 점수 50 이상, 영어 점수 80 이상인 학생들을 대상으로 각 반의 전 과목 총평균을 구하라.

      # 내장함수
      exam$tot <- (exam$math + exam$english + exam$science)/3
      aggregate(data=exam[exam$math >= 50 & exam$english >= 80,], tot~class, mean)
    
      # dplyr
      exam %>%
          filter(math >= 50 & english >= 80) %>%
          mutate(tot = (math + english + science)/3) %>%
          group_by(class) %>%
          summarise(mean = mean(tot))
    
  • dplyr 코드가 논리의 흐름대로 구조화되어 있어서 내장함수보다 가독성이 높고 이해하기 쉽다.

변수 타입

변수의 종류

  • 연속 변수와 범주 변수로 구분한다.
  • 변수의 값이 똑같이 숫자로 되어있어도 변수 종류가 무엇인지에 따라 사용할 수 있는 분석 방법이 다르다.
    1. 연속변수 - Numeric 타입
    • 키, 몸무게, 소득처럼 연속적이고 크기를 의미하는 값으로 구성된 변수
    • 숫자가 크기를 지니기 때문에 산술을 할 수 있다.
    • 양적 변수라고도 한다.
    • R에서 연속 변수는 numeric(뉴머릭)으로 표현된다.
      1. 범주변수 - Factor 타입
    • 값이 대상을 분류하는 의미를 지니는 변수
    • 성별변수 : 남자는 1, 여자는 2 > 각 범주를 분류한다.
    • 숫자가 크기를 의미하지 않기 때문에 산술을 할 수 없다.
    • 숫자가 대상을 지칭하는 이름과 같은 역할을 하기 때문에 명목변수라고도 한다.
    • R에서 범주 변수는 factor(펙터)로 표현된다.

변수 타입 간 차이

  1. 타입 변수 생성

     var1 <- c(1,2,3,1,2)            #numeric 변수 생성
     var2 <- factor(c(1,2,3,1,2))    #factor 변수 생성
    
  2. 출력

     > var1
     [1] 1 2 3 1 2
     > var2
     [1] 1 2 3 1 2
     Levels: 1 2 3
    
    • Levels : 값이 어떤 범주로 구성되는지 의미
    • factor 변수는 Levels 정보를 지니고 있다.
  3. factor는 연산이 안 된다

     var2 + 2
    
     [1] NA NA NA NA NA
     Warning message:
     In Ops.factor(var2, 2) : 요인(factors) 대하여 의미있는 + 아닙니다.
    
    • foctor 변수는 데이터가 범주이기 때문에 연산할 수 없다.
  4. 변수 타입 확인하기
    • class()를 이용하면 변수의 타입이 무엇인지 확인할 수 있다.
     class(var1)
    
     [1] "numeric"
     class(var2)
    
     [1] "factor"    
    
  5. factor의 구성 범주 확인하기
    • levels()를 이용하면 factor 변수의 값이 어떤 범주로 구성되는지 알 수 있다.
     levels(var1)
    
     NULL
    
     levels(var2)
    
     [1] "1" "2" "3"
    
  6. 문자로 구성된 factor 변수

     var3 <- c("a","b","b","c")
     var4 <- factor(c("a","b","b","c"))
     var3
     [1] "a" "b" "b" "c"
    
     var4
     [1] a b b c
     Levels: a b c
    
    • 숫자와 똑같다.
  7. class()를 사용하면 타입을 알 수 있다.

     class(var3)
    
     [1] "character"
    
     class(var4)
    
     [1] "factor"
    
  8. 함수마다 적용 가능한 변수 타입이 다르다.
    • 함수를 활용하려면 먼저 변수가 함수에 적용할 수 있는 타입인지 확인해야 함.
     > mean(var1)
     [1] 1.8
    
     > mean(var2)
     [1] NA
     Warning message:
     In mean.default(var2) :
     인자가 수치형 또는 논리형이 아니므로 NA를 반환합니다
    
    • var2는 factor 타입이기 때문에 경고메시지가 출력된다.

변수 타입 바꾸기

  • 함수를 실행했는데 이상한 결과가 나왔다면 변수가 함수에 적용할 수 있는 타입인지 확인해야 한다.
  • 타입이 맞지 않다면 함수에 적용할 수 있도록 변환해야 한다.
  1. 변수 타입 변환하기
    • var2를 numeric으로 변환
     > var2 <- as.numeric(var2)
     > mean(var2)
     [1] 1.8
    
  2. 변환하면 factor 타입이 아니게 된다.
     > class(var2)
     [1] "numeric"
     > levels(var2)
     NULL
    
  • as.로 시작하는 함수들은 변수의 타입을 바꾸는 기능
  • 이러한 함수를 변환함수라고 한다.

데이터 구조

데이터구조 차원 특징
벡터(Vactor) 1차원 한 가지 변수 타입으로 구성
데이터프레임(Data Frame) 2차원 다양한 변수 타입으로 구성
매트릭스(Matrix) 2차원 한 가지 변수 타입으로 구성
어레이(Array) 다차원 2차원 이상의 매트릭스
리스트(List) 다차원 서로 다른 데이터 구조 포함

데이터 구조 비교

  1. 벡터
    • 하나의 값 또는 여러 개의 값으로 구성된 데이터 구조
    • 여러 변수 타입을 섞을 수 없고, 한 가지 타입으로만 구성할 수 있다.
     > a<-1
     > a
     [1] 1
     > b<-"hello"
     > b
     [1] "hello"
     > class(a)
     [1] "numeric"
     > class(b)
     [1] "character"
    
  2. 데이터 프레임
    • 행과 열로 구성된 2차원 데이터 구조
    • 다양한 변수 타입으로 구성할 수 있다.
     > x1 <- data.frame(var1 = c(1,2,3),
     +                  var2 = c("a","b","c"))
     > x1
     var1 var2
     1    1    a
     2    2    b
     3    3    c
     > class(x1)
     [1] "data.frame"
    
  3. 매트릭스
    • 행과 열로 구성된 2차원 데이터 구조
    • 데이터 프레임과 다르게 한 가지 변수 타입으로만 구성할 수 있다.
     # 1~12로 2열
     > x2 <- matrix(c(1:12), ncol = 2)
     > x2
         [,1] [,2]
     [1,]    1    7
     [2,]    2    8
     [3,]    3    9
     [4,]    4   10
     [5,]    5   11
     [6,]    6   12
     > class(x2)
     [1] "matrix"
    
  4. 어레이
    • 2차원 이상으로 구성된 매트릭스
    • 한 가지 변수 타입으로만 구성할 수 있다.
     # 1~20으로 2행 * 5열 * 2차원
     > x3 <- array(1:20, dim = c(2,5,2))
     > x3
     , , 1
    
         [,1] [,2] [,3] [,4] [,5]
     [1,]    1    3    5    7    9
     [2,]    2    4    6    8   10
    
     , , 2
    
         [,1] [,2] [,3] [,4] [,5]
     [1,]   11   13   15   17   19
     [2,]   12   14   16   18   20
    
     > class(x3)
     [1] "array"
    
  5. 리스트
    • 모든 데이터 구조를 포함하는 데이터 구조
    • 여러 데이터 구조를 합해 하나의 리스트로 만들 수 있다.
     > x4 <- list(f1 = a,
     +            f2 = x1,
     +            f3 = x2,
     +            f4 = x3)
     > x4
     $f1
     [1] 1
    
     $f2
     var1 var2
     1    1    a
     2    2    b
     3    3    c
    
     $f3
         [,1] [,2]
     [1,]    1    7
     [2,]    2    8
     [3,]    3    9
     [4,]    4   10
     [5,]    5   11
     [6,]    6   12
    
     $f4
     , , 1
    
         [,1] [,2] [,3] [,4] [,5]
     [1,]    1    3    5    7    9
     [2,]    2    4    6    8   10
    
     , , 2
    
         [,1] [,2] [,3] [,4] [,5]
     [1,]   11   13   15   17   19
     [2,]   12   14   16   18   20
    
    • 함수의 결과물이 리스트 형태로 반환되는 경우가 많기 때문에 R에서 중요한 데이터 구조이다.
    • 함수의 결과물에서 특정 값을 추출할 수 있다.
     > mpg <- ggplot2::mpg
     > x <- boxplot(mpg$cty)
     $stats
         [,1]
     [1,]    9
     [2,]   14
     [3,]   17
     [4,]   19
     [5,]   26
     attr(,"class")
             1
     "integer"
    
     $n
     [1] 234
    
     $conf
             [,1]
     [1,] 16.48356
     [2,] 17.51644
    
     $out
     [1] 28 28 33 35 29
    
     $group
     [1] 1 1 1 1 1
    
     $names
     [1] "1"
    
     > x$stats[,1]       # 요약 통계량 추출
     [1]  9 14 17 19 26
     > x$stats[,1][3]    # 중앙값 추출
     [1] 17
     > x$stats[,1][2]    # 1분위수 추출
     [1] 14
    

카테고리:

업데이트: