• Home
  • About
    • Yerim Oh photo

      Yerim Oh

      Happy and worthwhile day by day :)

    • Learn More
    • Email
    • LinkedIn
    • Instagram
    • Github
    • Youtube
  • Posts
    • All Posts
    • All Tags
  • Projects

[11] R(데이터 처리 패키지 dplyr package)

26 Feb 2020

Reading time ~6 minutes

Table of Contents
  • 목차
  • 데이터munging (=wrangling)
  • dplyr package
    • 의미
      • 장점
      • 주의
      • 준비
  • 기본 함수들
    • filter()
      • %in%
    • arrange()
    • select()
      • helper function
        • everything()
        • rename()
    • # A tibble: 336,776 x 2
    • gain speed
    • 1 9 370.
    • 2 16 374.
    • 3 31 408.
    • 4 -17 517.
    • 5 -19 394.
    • 6 16 288.
    • 7 24 404.
    • 8 -11 259.
    • 9 -5 405.
    • 10 10 319.
    • # … with 336,766 more rows
  • 평균 출발지연시간 계산
    • # A tibble: 1 x 1
    • delay
    • 1 12.6
      • 위를 이용한 그룹 별 요약

목차

  • 데이터munging (=wrangling)
  • dplyr package
  • 기본 함수들
    • filter()
      • %in%
    • arrange()
    • select()
      • helper function
        • everything()
        • rename()
    • mutate()함수
    • summarize()
    • group_by
  • Pipe연산자

데이터munging (=wrangling)

  • 데이터 전처리
  • 파싱
  • 필터링
    이와 같이 분석가가 원하는 형태로 데이터를 변형하고 이리저리 핸들링하는 행위를 의미하는 신조어

dplyr package

데이터 처리에 특화된 패키지

의미

데이터 처리에 특화된 패키지
기존의 패키지인plyr는 모든 함수가R로 작성되어 있어 속도가 느린 문제가 있었으나,
dplyr은 C++ 로 작성되었기 때문에 매우 빠른 속도로 데이터 처리를 수행할 수 있게 되었다.

장점

  • 이 패키지를 이용하면 코드 작성이 직관적
  • 가독성이 좋음(특히pipe연산자를 이용한chaining syntax를 이용 시)

주의

  • 다만 dplyr패키지 내에 몇몇 base함수와 겹치는 이름의 함수가 있어 masking(덮어 씀) 이 일어남에 주의 필요
  • filter(),lag(),intersect(),setdiff(),setequal(),union()등
  • 또한 plyr패키지와 동시에 사용하는 경우masking문제에 더욱 유의할 필요 있음
  • 굳이 동시에 사용하려면plyr을 먼저 로드하기를 추천

준비

  • 예제 데이터 nycflights13패키지의 flights데이터셋
#install.packages("nycflights13")
library(nycflights13)
data(flights)

[오류]
만약 설치 오류가 난다면 밑의 코드를 먼저 실행 후 설치

.libPaths()
.libPaths("C:/myRproject/Library")

기본 함수들

  • filter(): 지정 조건에 맞는 관측치 추출(행 방향)
  • arrange(): 지정 조건에 따라 관측치 정렬
  • select(): 변수 추출(열 방향)
  • mutate(): 기존 변수를 이용해 새로운 변수 생성()
  • summarize(): 요약 정보 추출
  • group_by(): 지정 변수에 따라 정의된 그룹별로 적용 범위를 제한47

filter()

filter(데이터 셋 이름, 행이름과 조건, 행이름과 조건)

[1. flights 데이터 확인]
image

  • Tibble: 처음 몇건만 보내줌
    • 행: 10건만 보여줬으니까 336,766이 더있음
    • 열: 9개가 더 있음

[2. 조건에 맞는 데이터 추출]
filter(): 데이터 프레임에서 조건에 따른 레코드(row) 추출

  • AND: ‘,’ 또는 ‘&’
  • OR:

filter(flights, flights$month == 1, flights$day==1) image

%in%

\(∈\) 과 같음
filter(flights, month%in%c(11,12))

  • 즉, ∈ {11,12}
  • 계속 == 쓰기 힘드니까

[3.객체로 저장]
A<-filter(flights, month%in%c(11,12))


arrange()

써놓은 자료를 기준으로 sorting 해라

[1. 정렬]
arrange(data, a,b,c)

  • data: 정렬할 데이터 이름
  • a,b,c: 정렬 기준
#year, month, day에 대한 정렬
arrange(flights, year, month, day)
## # A tibble: 336,776 x 19
## year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
##    <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
##  1  2013     1     1      517            515         2      830            819
##  2  2013     1     1      533            529         4      850            830
##  3  2013     1     1      542            540         2      923            850
##  4  2013     1     1      544            545        -1     1004           1022
##  5  2013     1     1      554            600        -6      812            837
##  6  2013     1     1      554            558        -4      740            728
##  7  2013     1     1      555            600        -5      913            854
##  8  2013     1     1      557            600        -3      709            723
##  9  2013     1     1      557            600        -3      838            846
## 10  2013     1     1      558            600        -2      753            745
## # … with 336,766 more rows, and 11 more variables: arr_delay <dbl>,
## #   carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## #   air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>

[2. 역순정렬(내림차순)]
arrange(data, desc(a))

  • desc(a): a에 대한 역순정렬(내림차순)
# arr_delay에 대한 역순정렬(내림차순)
arrange(flights, desc(arr_delay))
# # A tibble: 336,776 x 19
##  year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
##    <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
##  1  2013     1     9      641            900      1301     1242           1530
##  2  2013     6    15     1432           1935      1137     1607           2120
##  3  2013     1    10     1121           1635      1126     1239           1810
##  4  2013     9    20     1139           1845      1014     1457           2210
##  5  2013     7    22      845           1600      1005     1044           1815
##  6  2013     4    10     1100           1900       960     1342           2211
##  7  2013     3    17     2321            810       911      135           1020
##  8  2013     7    22     2257            759       898      121           1026
##  9  2013    12     5      756           1700       896     1058           2020
## 10  2013     5     3     1133           2055       878     1250           2215
## # … with 336,766 more rows, and 11 more variables: arr_delay <dbl>,
## #   carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## #   air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>

select()

추출하는 함수

[1. 추출]
select(data, a, b, c)

  • a, b, c: a, b, c 열을 추출
# year, month, day 열을 추출
select(flights, year, month, day)
## # A tibble: 336,776 x 3
##     year month   day
##    <int> <int> <int>
##  1  2013     1     1
##  2  2013     1     1
##  3  2013     1     1
##  4  2013     1     1
##  5  2013     1     1
##  6  2013     1     1
##  7  2013     1     1
##  8  2013     1     1
##  9  2013     1     1
## 10  2013     1     1
## # … with 336,766 more rows

[2. 슬라이싱 추출]
select(data, a:c)

  • a:c: a~c 열을 추출
# year부터 day까지 추출
select(flights, year:day)
## # A tibble: 336,776 x 3
##     year month   day
##    <int> <int> <int>
##  1  2013     1     1
##  2  2013     1     1
##  3  2013     1     1
##  4  2013     1     1
##  5  2013     1     1
##  6  2013     1     1
##  7  2013     1     1
##  8  2013     1     1
##  9  2013     1     1
## 10  2013     1     1
## # … with 336,766 more rows

[3. 제외 후 추출]
select(data, -(a:b))

  • -(a:b): a에서 b까지 를 빼고 추출
  • ‘-’: column 제외
# year 부터 flight까지 열 제외
select(flights, -(year:flight))
## # A tibble: 336,776 x 8
##    tailnum origin dest  air_time distance  hour minute time_hour          
##    <chr>   <chr>  <chr>    <dbl>    <dbl> <dbl>  <dbl> <dttm>             
##  1 N14228  EWR    IAH        227     1400     5     15 2013-01-01 05:00:00
##  2 N24211  LGA    IAH        227     1416     5     29 2013-01-01 05:00:00
##  3 N619AA  JFK    MIA        160     1089     5     40 2013-01-01 05:00:00
##  4 N804JB  JFK    BQN        183     1576     5     45 2013-01-01 05:00:00
##  5 N668DN  LGA    ATL        116      762     6      0 2013-01-01 06:00:00
##  6 N39463  EWR    ORD        150      719     5     58 2013-01-01 05:00:00
##  7 N516JB  EWR    FLL        158     1065     6      0 2013-01-01 06:00:00
##  8 N829AS  LGA    IAD         53      229     6      0 2013-01-01 06:00:00
##  9 N593JB  JFK    MCO        140      944     6      0 2013-01-01 06:00:00
## 10 N3ALAA  LGA    ORD        138      733     6      0 2013-01-01 06:00:00
## # … with 336,766 more rows

helper function

everything()

  • 나머지 데이터를 불러오는 기능
  • 순서를 바꾸고 싶을 때 먼저 앞에 올 것을 부르고 이를 통해 나머지 데이터를 불러 옴으로써 순서 변경

select(flights, time_hour, air_time,everything()) image

rename()

  • 변수 명을 새로 설정해주는 함수
* 바꿀이름= 원래이름    
* **a**: 바꿀이름     
* **b**: 원래이름     


```rename(flights,tail_num= tailnum)```
![image](https://user-images.githubusercontent.com/76824611/122313934-20d48a80-cf52-11eb-8e27-3185a5cb5a45.png)


---

## mutate()함수
새로 변수를 만드는 함수        

**[1, 열 추가]**      
```transmute(data, a= calcau1, b=calcau2)```     
* **a=, b=**: 새로 추가할 열 이름      
* **calcau11,calcau12**: 새로 추가할 열 연산     
 

transmute(flights, gain = arr_delay - dep_delay, speed = distance / air_time * 60)

# A tibble: 336,776 x 2

gain speed

1 9 370.

2 16 374.

3 31 408.

4 -17 517.

5 -19 394.

6 16 288.

7 24 404.

8 -11 259.

9 -5 405.

10 10 319.

# … with 336,766 more rows


----

## summarize()
**mean(), sd(), var(), median()** 등을 이용 기초 통계량       
결과는 데이터프레임의 형태로 나옴
* ```na.rm = TRUE``` : 결측 값이 있을 시 무시       

**[1. mean()]**    

평균 출발지연시간 계산

summarise(flights, delay = mean(dep_delay, na.rm = TRUE))

# A tibble: 1 x 1

delay

1 12.6


---

## group_by

```new_data<-group_by(dara,a,b)```      
* **new_data**: 그룹바이 한 결과를 저장할 변수       
* **a,b**: a,b를 기준으로 나머지 데이터 정리(묶음)         

위를 이용한 그룹 별 요약

by_month(year과 month)별로 delay의 평균

by_month<-group_by(flights, year, month) summarise(by_month,delay=mean(dep_delay,na.rm=TRUE))

![image](https://user-images.githubusercontent.com/76824611/122314599-6ba2d200-cf53-11eb-9df0-0a1b225c5303.png)


---

# Pipe연산자
* **(%>%)**: 파이프 연산자      
magrittr패키지에서 제공하는 기능으로 코드의 가독성 및 작성시 편의성을 제고      

`summarise()` ungrouping output (override with `.groups` argument)

delays<-flights %>% group_by(dest)%>% summarise(count=n(), dist=mean(distance,na.rm=TRUE), delay=mean(arr_delay,na.rm=TRUE))%>% filter(count>20, dest!=”HNL”)



`geom_smooth()` using method = 'loess' and formula 'y ~ x'56

ggplot(data= delays,mapping=aes(x= dist,y= delay))+ geom_point(aes(size= count),alpha=1/3)+ geom_smooth(se=FALSE)


`summarise()` regrouping output by 'year', 'month' (overridewith `.groups` argument

flights%>% filter(!is.na(dep_delay),!is.na(arr_delay))%>% group_by(year, month, day)%>% summarise(count=n(), delay=mean(dep_delay))%>% ggplot(mapping=aes(x= delay,y=count))+ geom_point(alpha=1/10) ```



RBasic Share Tweet +1