R에서 데이터를 다룰 때, R 데이터 프레임은 중심적인 역할을 합니다. 이번 포스트에서는 R 데이터 프레임 전처리 방법들에 대해 알아보겠습니다. 데이터 프레임 인덱싱에서부터 필터링, 각 열을 삭제, 추가, 그리고 변경하는 법까지 쫘악 한번 살펴보시죠!

R 데이터 프레임 인덱싱

R 데이터 프레임의 원소에 접근하는 인덱싱 방법에 대하여 배워봅시다. 데이터 프레임에 접근하는 방법은 크게 2가지 방법이 있습니다.

  • 달러 () 연산자를 사용하여 접근하는 방법</li> <!-- /wp:list-item -->  <!-- wp:list-item --> <li>행렬 인덱싱을 사용하여 접근하는 방법</li> <!-- /wp:list-item --></ul> <!-- /wp:list -->  <!-- wp:paragraph --> 각 방법을 설명하기 위하여 예제 데이터를 불러오겠습니다. <!-- /wp:paragraph -->  <!-- wp:kadence/image {"align":"center","id":3059,"sizeSlug":"medium_large","linkDestination":"none","uniqueID":"3053_e8a4dc-79"} --> <div class="wp-block-kadence-image kb-image3053_e8a4dc-79"><figure class="aligncenter size-medium_large"><img src="https://statisticsplaybook.com/wp-content/uploads/2023/10/r-데이터프레임-전처리-정리-768x439.jpg" alt="r 데이터 프레임 전처리 정리" class="kb-img wp-image-3059"/><figcaption>정보들이 프레임 안에 딱 맞춰 들어가있는 데이터프레임</figcaption></figure></div> <!-- /wp:kadence/image -->  <!-- wp:heading {"level":3} --> <h3 class="wp-block-heading">예제 중간고사 성적 데이터 불러오기</h3> <!-- /wp:heading -->  <!-- wp:paragraph --> 주어진 <a href="https://statisticsplaybook.com/go/examscore-csv/">링크</a>를 사용하여 ``examscore.csv'' 파일을 다운로드하고 데이터를 불러옵니다. <!-- /wp:paragraph -->  <!-- wp:code {"className":"language-r"} --> <pre class="wp-block-code language-r"><code>library(tidyverse) mydata <- read_csv("examscore.csv")</code></pre> <!-- /wp:code -->  <!-- wp:paragraph --> 위 코드를 실행하면 <code>mydata</code>라는 데이터 프레임이 생성되고, <code>head()</code> 함수를 통해 데이터의 첫 부분을 확인할 수 있습니다. <code>dim()</code> 함수를 사용하여 데이터 프레임의 차원(행과 열 개수)을 출력할 수 있습니다. <!-- /wp:paragraph -->  <!-- wp:code {"className":"language-r"} --> <pre class="wp-block-code language-r"><code>head(mydata)</code></pre> <!-- /wp:code -->  <!-- wp:code {"className":"language-r"} --> <pre class="wp-block-code language-r"><code>>> # A tibble: 6 × 4 >>   student_id gender midterm final >>        <dbl> <chr>    <dbl> <dbl> >> 1          1 F           38    46 >> 2          2 M           42    67 >> 3          3 F           53    56 >> 4          4 M           48    54 >> 5          5 M           46    39 >> 6          6 M           51    74</code></pre> <!-- /wp:code -->  <!-- wp:code {"className":"language-r"} --> <pre class="wp-block-code language-r"><code>dim(mydata)</code></pre> <!-- /wp:code -->  <!-- wp:code {"className":"language-r"} --> <pre class="wp-block-code language-r"><code>>> [1] 30  4</code></pre> <!-- /wp:code -->  <!-- wp:heading {"level":3} --> <h3 class="wp-block-heading">R 데이터 프레임 특정 열 추출</h3> <!-- /wp:heading -->  <!-- wp:heading {"level":4} --> <h4 class="wp-block-heading">달러 연산자를 사용하여 열 접근하기

    </code> 연산자를 사용하여 R 데이터 프레임 특정 열 추출을 할 수 있습니다. <!-- /wp:paragraph -->  <!-- wp:code {"className":"language-r"} --> <pre class="wp-block-code language-r"><code>mydatamidterm

    >>  [1] 38 42 53 48 46 51 48 43 28 38 50 29 27 36 29 34 35
    >> [18] 46 39  9 76 15 63 28 49 42 24 52 65 52
    mydatagender</code></pre> <!-- /wp:code -->  <!-- wp:code {"className":"language-r"} --> <pre class="wp-block-code language-r"><code>>>  [1] "F" "M" "F" "M" "M" "M" "M" "M" "M" "M" "F" "F" >> [13] "M" "M" "M" "F" "F" "F" "M" "M" "M" "M" "M" "M" >> [25] "M" "M" "F" "F" "F" "M"</code></pre> <!-- /wp:code -->  <!-- wp:heading {"level":4} --> <h4 class="wp-block-heading">행렬 인덱싱 방법으로 원소 접근하기</h4> <!-- /wp:heading -->  <!-- wp:paragraph --> 데이터 프레임을 행렬 형태로 접근할 수도 있습니다. <code>[, ]</code>를 사용하여 원하는 열이나 행에 접근할 수 있습니다. <!-- /wp:paragraph -->  <!-- wp:code {"className":"language-r"} --> <pre class="wp-block-code language-r"><code>mydata[, 1]</code></pre> <!-- /wp:code -->  <!-- wp:code {"className":"language-r"} --> <pre class="wp-block-code language-r"><code>>> # A tibble: 30 × 1 >>     student_id >>         <dbl> >> 1          1 >> 2          2 >> 3          3 >> 4          4 >> 5          5 >> 6          6 >> 7          7 >> 8          8 >> 9          9 >> 10         10 >> # ℹ 20 more rows >> # ℹ Use `print(n = ...)` to see more rows</code></pre> <!-- /wp:code -->  <!-- wp:code {"className":"language-r"} --> <pre class="wp-block-code language-r"><code>mydata[2, 1]</code></pre> <!-- /wp:code -->  <!-- wp:code {"className":"language-r"} --> <pre class="wp-block-code language-r"><code>>> # A tibble: 1 × 1 >>   student_id >>        <dbl> >> 1          2</code></pre> <!-- /wp:code -->  <!-- wp:heading {"level":4} --> <h4 class="wp-block-heading">pull 함수를 사용한 벡터로 변환하기</h4> <!-- /wp:heading -->  <!-- wp:paragraph --> 데이터 프레임과 다르게 행렬 형태로 접근할 경우, 1줄이 남더라도 tibble을 유지합니다. 이것을 벡터 형태로 바꾸기 위해서는 <code>pull()</code>를 사용하여 안의 내용을 <code>tibble</code> 밖으로 끌어내야합니다. <!-- /wp:paragraph -->  <!-- wp:code {"className":"language-r"} --> <pre class="wp-block-code language-r"><code>pull(mydata[, 1])</code></pre> <!-- /wp:code -->  <!-- wp:code {"className":"language-r"} --> <pre class="wp-block-code language-r"><code>>>  [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 >> [18] 18 19 20 21 22 23 24 25 26 27 28 29 30</code></pre> <!-- /wp:code -->  <!-- wp:heading --> <h2 class="wp-block-heading">R 데이터 프레임 추출 (필터링)</h2> <!-- /wp:heading -->  <!-- wp:paragraph --> R에서 데이터 프레임의 특정 조건을 만족하는 행들을 다음과 같은 행렬 형식 접근 방법을 사용하여 조건을 만족하는 행들을 선택 할 수 있습니다. <!-- /wp:paragraph -->  <!-- wp:code {"className":"language-r"} --> <pre class="wp-block-code language-r"><code>mydata[mydatamidterm <= 15,]
    >> # A tibble: 2 × 4
    >>   student_id gender midterm final
    >>        <dbl> <chr>    <dbl> <dbl>
    >> 1         20 M            9    33
    >> 2         22 M           15    12

    R 데이터 프레임 공백 제거하기

    만약 데이터 프레임의 행렬이 다음과 같이 빈 칸 (공백)이 삽입되어 있다고 생각해봅시다.

    mydata[1, 2] <- NA
    mydata[5, 1] <- NA
    head(mydata)
    >> # A tibble: 6 × 4
    >>   student_id gender midterm final
    >>        <dbl> <chr>    <dbl> <dbl>
    >> 1          1 <NA>        38    46
    >> 2          2 M           42    67
    >> 3          3 F           53    56
    >> 4          4 M           48    54
    >> 5         NA M           46    39
    >> 6          6 M           51    74

    is.na() 함수로 빈칸이 들어있는 부분을 열 별로 체크할 수 있습니다.

    sum(is.na(mydatagender))</code></pre> <!-- /wp:code -->  <!-- wp:code {"className":"language-r"} --> <pre class="wp-block-code language-r"><code>>> [1] 1</code></pre> <!-- /wp:code -->  <!-- wp:code {"className":"language-r"} --> <pre class="wp-block-code language-r"><code>sum(is.na(mydatastudent_id))
    >> [1] 1

    하지만, 빈 칸이 포함된 행을 체크하려면 complete.cases() 함수를 사용해야 합니다. complete.cases() 함수는 모든 열이 꽉 채워져 있는 완전한 행들 만을 TRUE로 반환합니다.

    • 공백(NA)가 제거된 꽉 찬 데이터 프레임 얻어내기
    complete_row <- complete.cases(mydata)
    sum(complete_row) # 완전한 행의 수
    >> [1] 28
    mydata[complete_row,]
    >> # A tibble: 28 × 4
    >>    student_id gender midterm final
    >>         <dbl> <chr>    <dbl> <dbl>
    >>  1          2 M           42    67
    >>  2          3 F           53    56
    >>  3          4 M           48    54
    >>  4          6 M           51    74
    >>  5          7 M           48    36
    >>  6          8 M           43    58
    >>  7          9 M           28    25
    >>  8         10 M           38    59
    >>  9         11 F           50    40
    >> 10         12 F           29    44
    >> # ℹ 18 more rows

    R 데이터 프레임 삭제/추가/변경

    R 데이터 프레임 열 추가하기

    </code> 기호를 사용하여 새로운 열을 추가하거나 기존 열을 변경할 수 있습니다. 예를 들어, <code>mydata</code> 데이터 프레임에 <code>midterm</code> 열과 <code>final</code> 열의 값을 더하여 <code>total</code> 열을 추가하고, <code>total</code> 열의 앞부분 몇 개 행을 확인하려면 아래와 같이 코드를 작성합니다 <!-- /wp:paragraph -->  <!-- wp:code {"className":"language-r"} --> <pre class="wp-block-code language-r"><code>mydatatotal <- mydatamidterm + mydatafinal mydata[1:3, 4:5]

    >> # A tibble: 3 × 2
    >>   final total
    >>   <dbl> <dbl>
    >> 1    46    84
    >> 2    67   109
    >> 3    56   109

    R 데이터 프레임 합치기

    cbind() 함수를 사용하여 새로운 열을 추가할 수도 있습니다. 예를 들어, mydata 데이터 프레임에 total 열의 값의 절반을 나타내는 average 열을 추가하고, 결과를 확인하려면 아래와 같이 코드를 작성합니다. 즉, cbind() 함수는 안에 입력 된 두 데이터 프레임을 합쳐주는 역할을 합니다.

    mydata_cbind <- cbind(mydata, mydatatotal/2) head(mydata_cbind)</code></pre> <!-- /wp:code -->  <!-- wp:code {"className":"language-r"} --> <pre class="wp-block-code language-r"><code>>>   student_id gender midterm final total mydatatotal/2
    >> 1          1   <NA>      38    46    84           42.0
    >> 2          2      M      42    67   109           54.5
    >> 3          3      F      53    56   109           54.5
    >> 4          4      M      48    54   102           51.0
    >> 5         NA      M      46    39    85           42.5
    >> 6          6      M      51    74   125           62.5

    하지만 cbind()를 사용하면 결과가 데이터 프레임으로 변환되는 것을 알 수 있습니다.

    R tidyverse bind_cols() 함수와 bind_rows() 함수

    tidyverse에서는 cbind()rbind() 함수와 동일한 기능을 하는 bind_cols()bind_rows() 함수를 제공합니다.

    • 두 행렬을 열 방향으로 합치고 싶은 경우: bind_cols()
    • 두 행렬을 행 방향으로 합치고 싶은 경우: bind_rows()
    mydata <- bind_cols(mydata, mydatatotal/2) head(mydata)</code></pre> <!-- /wp:code -->  <!-- wp:code {"className":"language-r"} --> <pre class="wp-block-code language-r"><code>>> # A tibble: 6 × 6 >>   student_id gender midterm final total  ...6 >>        <dbl> <chr>    <dbl> <dbl> <dbl> <dbl> >> 1          1 <NA>        38    46    84  42   >> 2          2 M           42    67   109  54.5 >> 3          3 F           53    56   109  54.5 >> 4          4 M           48    54   102  51   >> 5         NA M           46    39    85  42.5 >> 6          6 M           51    74   125  62.5</code></pre> <!-- /wp:code -->  <!-- wp:paragraph --> 마지막 칼럼 이름을 다음과 같이 수정해주도록 하겠습니다. <!-- /wp:paragraph -->  <!-- wp:code {"className":"language-r"} --> <pre class="wp-block-code language-r"><code>names(mydata)[6] <- "average" head(mydata)</code></pre> <!-- /wp:code -->  <!-- wp:code {"className":"language-r"} --> <pre class="wp-block-code language-r"><code>>> # A tibble: 6 × 6 >>   student_id gender midterm final total average >>        <dbl> <chr>    <dbl> <dbl> <dbl>   <dbl> >> 1          1 <NA>        38    46    84    42   >> 2          2 M           42    67   109    54.5 >> 3          3 F           53    56   109    54.5 >> 4          4 M           48    54   102    51   >> 5         NA M           46    39    85    42.5 >> 6          6 M           51    74   125    62.5</code></pre> <!-- /wp:code -->  <!-- wp:heading {"level":3} --> <h3 class="wp-block-heading">R 데이터 프레임 열 삭제하기</h3> <!-- /wp:heading -->  <!-- wp:paragraph --> R에서 데이터 프레임의 열을 삭제하는 방법으로 <code>NULL</code>을 사용할 수 있습니다. 예를 들어, <code>mydata</code> 데이터 프레임에서 <code>gender</code> 열을 삭제하려면 아래와 같이 코드를 작성합니다. <!-- /wp:paragraph -->  <!-- wp:code {"className":"language-r"} --> <pre class="wp-block-code language-r"><code>mydatagender <- NULL
    head(mydata)
    >> # A tibble: 6 × 5
    >>   student_id midterm final total average
    >>        <dbl>   <dbl> <dbl> <dbl>   <dbl>
    >> 1          1      38    46    84    42  
    >> 2          2      42    67   109    54.5
    >> 3          3      53    56   109    54.5
    >> 4          4      48    54   102    51  
    >> 5         NA      46    39    85    42.5
    >> 6          6      51    74   125    62.5

    본 포스팅은 R 프로그래밍 기초 공략.zip 교재의 일부분 입니다. 본 교재는 R을 독학하시는 분들을 위하여 특별히 제작된 교재입니다. R을 이제 막 시작하셨다면 슬기로운 통계생활과 같이 공부해보세요!

Similar Posts