새소식

강의 및 세미나 자료/R

R 핵심만 배우기 #5 - dplyr

  • -
R기초5

R을 이용한 데이터 전처리 : dplyr

오늘은 R을 활용한 데이터 전처리를 다뤄보겠습니다. 여기서 데이터 전처리라 함은 Data munging 혹은 data wrangling 이라고도 불리는데요. 이는 raw 데이터를 우리가 원하는 형태로 바꾸는 것을 의미합니다. 불필요한 정보를 제거하거나 다른 패키지의 input으로 활용하는 등의 다양한 작업에 있어서 꼭 필요한 작업인 동시에 많은 시간이 필요한 작업입니다. 오늘 배울 dplyr는 특정 데이터를 추출, 새로운 변수를 추가, group별 연산 등 다양하게 활용되는 패키지이므로 꼭 알아두시기 바랍니다.

dplyr

dplyr에서 다음 3가지는 꼭 알아두세요. 

 * filter(데이터, 조건, 조건, ..) : 조건에 맞는 row를 선택

 * select(데이터, column이름, ..) : 조건에 맞는 column을 선택 

 * mutate(데이터, 새로운 변수 = 기존 변수 조합,..) : 기존의 변수를 활용하여 새로운 column 추가

추가적으로 arrange, summarise, group_by 에 대해서도 내가 원하는 작업과 함수의 이름을 잘 매칭시켜 기억해 두시기 바랍니다. 

 * arrange() : 정렬 

 * summarise() : 각 column별 평균, 표준편차 계산 등 

 * group_by() : group별로 묶어주는 역할


dplyr를 활용한 예제

먼저 dplyr를 설치합니다. 그리고 hflights 라는 데이터셋도 같이 설치하겠습니다.

install.packages('dplyr')
install.packages('hflights') #미국 휴스턴에서 출발하는 모든 비행기의  2011년 이착륙기록 데이터

위 명령어는 패키지를 다운받아서 컴퓨터에 설치한 것이고, 이를 R에서 불러오기 위해서는 library(‘패키지명’) 명령어를 꼭 실행해 줘야 합니다.

library(dplyr)
library(hflights) 
head(hflights)
##      Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier
## 5424 2011     1          1         6    1400    1500            AA
## 5425 2011     1          2         7    1401    1501            AA
## 5426 2011     1          3         1    1352    1502            AA
## 5427 2011     1          4         2    1403    1513            AA
## 5428 2011     1          5         3    1405    1507            AA
## 5429 2011     1          6         4    1359    1503            AA
##      FlightNum TailNum ActualElapsedTime AirTime ArrDelay DepDelay Origin
## 5424       428  N576AA                60      40      -10        0    IAH
## 5425       428  N557AA                60      45       -9        1    IAH
## 5426       428  N541AA                70      48       -8       -8    IAH
## 5427       428  N403AA                70      39        3        3    IAH
## 5428       428  N492AA                62      44       -3        5    IAH
## 5429       428  N262AA                64      45       -7       -1    IAH
##      Dest Distance TaxiIn TaxiOut Cancelled CancellationCode Diverted
## 5424  DFW      224      7      13         0                         0
## 5425  DFW      224      6       9         0                         0
## 5426  DFW      224      5      17         0                         0
## 5427  DFW      224      9      22         0                         0
## 5428  DFW      224      9       9         0                         0
## 5429  DFW      224      6      13         0                         0
str(hflights)
## 'data.frame':    227496 obs. of  21 variables:
##  $ Year             : int  2011 2011 2011 2011 2011 2011 2011 2011 2011 2011 ...
##  $ Month            : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ DayofMonth       : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ DayOfWeek        : int  6 7 1 2 3 4 5 6 7 1 ...
##  $ DepTime          : int  1400 1401 1352 1403 1405 1359 1359 1355 1443 1443 ...
##  $ ArrTime          : int  1500 1501 1502 1513 1507 1503 1509 1454 1554 1553 ...
##  $ UniqueCarrier    : chr  "AA" "AA" "AA" "AA" ...
##  $ FlightNum        : int  428 428 428 428 428 428 428 428 428 428 ...
##  $ TailNum          : chr  "N576AA" "N557AA" "N541AA" "N403AA" ...
##  $ ActualElapsedTime: int  60 60 70 70 62 64 70 59 71 70 ...
##  $ AirTime          : int  40 45 48 39 44 45 43 40 41 45 ...
##  $ ArrDelay         : int  -10 -9 -8 3 -3 -7 -1 -16 44 43 ...
##  $ DepDelay         : int  0 1 -8 3 5 -1 -1 -5 43 43 ...
##  $ Origin           : chr  "IAH" "IAH" "IAH" "IAH" ...
##  $ Dest             : chr  "DFW" "DFW" "DFW" "DFW" ...
##  $ Distance         : int  224 224 224 224 224 224 224 224 224 224 ...
##  $ TaxiIn           : int  7 6 5 9 9 6 12 7 8 6 ...
##  $ TaxiOut          : int  13 9 17 22 9 13 15 12 22 19 ...
##  $ Cancelled        : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ CancellationCode : chr  "" "" "" "" ...
##  $ Diverted         : int  0 0 0 0 0 0 0 0 0 0 ...
들어가기 전에 dplyr - tbl_df()

dplyr가 제공하는 기능 중 특별한 건 아니고, 크기가 큰 데이터를 실수로 실행하게 되면, 모든 데이터가 console에 출력되면서 시간이 오래 걸리는데, 이를 방지하기 위해 데이터 일부만 보여주는 기능입니다.

hflights_df <- tbl_df(hflights)
hflights_df
## # A tibble: 227,496 x 21
##     Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier
## *  <int> <int>      <int>     <int>   <int>   <int>         <chr>
## 1   2011     1          1         6    1400    1500            AA
## 2   2011     1          2         7    1401    1501            AA
## 3   2011     1          3         1    1352    1502            AA
## 4   2011     1          4         2    1403    1513            AA
## 5   2011     1          5         3    1405    1507            AA
## 6   2011     1          6         4    1359    1503            AA
## 7   2011     1          7         5    1359    1509            AA
## 8   2011     1          8         6    1355    1454            AA
## 9   2011     1          9         7    1443    1554            AA
## 10  2011     1         10         1    1443    1553            AA
## # ... with 227,486 more rows, and 14 more variables: FlightNum <int>,
## #   TailNum <chr>, ActualElapsedTime <int>, AirTime <int>, ArrDelay <int>,
## #   DepDelay <int>, Origin <chr>, Dest <chr>, Distance <int>,
## #   TaxiIn <int>, TaxiOut <int>, Cancelled <int>, CancellationCode <chr>,
## #   Diverted <int>

dplyr - 1번 : filter() 를 이용해 원하는 row 선택하기

예를 들어, hflights_df 라는 데이터셋에는 Month, DayOfMonth, Distance라는 변수가 있는데, Month는 2이고, DayOfMonth는 1이며, Distance는 200이하인 row만 선택하고 싶을 때, 바로 filter를 사용합니다.

문법은 filter(데이터, 조건1, 조건2, …) 와 같이 데이터와 조건을 차례대로 나열하면 됩니다.

filter(hflights_df, Month==2, DayofMonth ==1, Distance <=200)
## # A tibble: 39 x 21
##     Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier
##    <int> <int>      <int>     <int>   <int>   <int>         <chr>
## 1   2011     2          1         2    1559    1707            CO
## 2   2011     2          1         2    1533    1624            CO
## 3   2011     2          1         2    1303    1407            CO
## 4   2011     2          1         2    1322    1436            CO
## 5   2011     2          1         2    1909    2020            CO
## 6   2011     2          1         2    1455    1556            CO
## 7   2011     2          1         2    1939    2033            CO
## 8   2011     2          1         2    2101    2207            CO
## 9   2011     2          1         2    2100    2151            CO
## 10  2011     2          1         2    1424    1521            CO
## # ... with 29 more rows, and 14 more variables: FlightNum <int>,
## #   TailNum <chr>, ActualElapsedTime <int>, AirTime <int>, ArrDelay <int>,
## #   DepDelay <int>, Origin <chr>, Dest <chr>, Distance <int>,
## #   TaxiIn <int>, TaxiOut <int>, Cancelled <int>, CancellationCode <chr>,
## #   Diverted <int>
  • filter()의 특징은 같은 column에 대해서도 조건을 걸 수 있다는 겁니다. 예를 들어 1월, 2월 데이터를 추가하고 싶으면 or(|) 조건을 활용해 아래와 같이 쓸 수 있습니다.
filter(hflights_df, Month == 1 | Month == 2)
## # A tibble: 36,038 x 21
##     Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier
##    <int> <int>      <int>     <int>   <int>   <int>         <chr>
## 1   2011     1          1         6    1400    1500            AA
## 2   2011     1          2         7    1401    1501            AA
## 3   2011     1          3         1    1352    1502            AA
## 4   2011     1          4         2    1403    1513            AA
## 5   2011     1          5         3    1405    1507            AA
## 6   2011     1          6         4    1359    1503            AA
## 7   2011     1          7         5    1359    1509            AA
## 8   2011     1          8         6    1355    1454            AA
## 9   2011     1          9         7    1443    1554            AA
## 10  2011     1         10         1    1443    1553            AA
## # ... with 36,028 more rows, and 14 more variables: FlightNum <int>,
## #   TailNum <chr>, ActualElapsedTime <int>, AirTime <int>, ArrDelay <int>,
## #   DepDelay <int>, Origin <chr>, Dest <chr>, Distance <int>,
## #   TaxiIn <int>, TaxiOut <int>, Cancelled <int>, CancellationCode <chr>,
## #   Diverted <int>
참고 : dplyr의 filter는 R의 기본 함수인 subset과 비슷합니다.
subset(hflights_df, Month == 2 & DayofMonth == 1 & Distance <=200)
## # A tibble: 39 x 21
##     Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier
##    <int> <int>      <int>     <int>   <int>   <int>         <chr>
## 1   2011     2          1         2    1559    1707            CO
## 2   2011     2          1         2    1533    1624            CO
## 3   2011     2          1         2    1303    1407            CO
## 4   2011     2          1         2    1322    1436            CO
## 5   2011     2          1         2    1909    2020            CO
## 6   2011     2          1         2    1455    1556            CO
## 7   2011     2          1         2    1939    2033            CO
## 8   2011     2          1         2    2101    2207            CO
## 9   2011     2          1         2    2100    2151            CO
## 10  2011     2          1         2    1424    1521            CO
## # ... with 29 more rows, and 14 more variables: FlightNum <int>,
## #   TailNum <chr>, ActualElapsedTime <int>, AirTime <int>, ArrDelay <int>,
## #   DepDelay <int>, Origin <chr>, Dest <chr>, Distance <int>,
## #   TaxiIn <int>, TaxiOut <int>, Cancelled <int>, CancellationCode <chr>,
## #   Diverted <int>

Quiz

iris 데이터에서 Sepal.Length가 5 이하이고, Species가 setosa인 것은?

##    Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1           4.9         3.0          1.4         0.2  setosa
## 2           4.7         3.2          1.3         0.2  setosa
## 3           4.6         3.1          1.5         0.2  setosa
## 4           5.0         3.6          1.4         0.2  setosa
## 5           4.6         3.4          1.4         0.3  setosa
## 6           5.0         3.4          1.5         0.2  setosa
## 7           4.4         2.9          1.4         0.2  setosa
## 8           4.9         3.1          1.5         0.1  setosa
## 9           4.8         3.4          1.6         0.2  setosa
## 10          4.8         3.0          1.4         0.1  setosa
## 11          4.3         3.0          1.1         0.1  setosa
## 12          4.6         3.6          1.0         0.2  setosa
## 13          4.8         3.4          1.9         0.2  setosa
## 14          5.0         3.0          1.6         0.2  setosa
## 15          5.0         3.4          1.6         0.4  setosa
## 16          4.7         3.2          1.6         0.2  setosa
## 17          4.8         3.1          1.6         0.2  setosa
## 18          4.9         3.1          1.5         0.2  setosa
## 19          5.0         3.2          1.2         0.2  setosa
## 20          4.9         3.6          1.4         0.1  setosa
## 21          4.4         3.0          1.3         0.2  setosa
## 22          5.0         3.5          1.3         0.3  setosa
## 23          4.5         2.3          1.3         0.3  setosa
## 24          4.4         3.2          1.3         0.2  setosa
## 25          5.0         3.5          1.6         0.6  setosa
## 26          4.8         3.0          1.4         0.3  setosa
## 27          4.6         3.2          1.4         0.2  setosa
## 28          5.0         3.3          1.4         0.2  setosa

dplyr - 2번 select() 를 이용해 원하는 column 추출하기

특정 column을 선택하고 싶을 때 사용합니다.

select(hflights_df, Year, Month) #Year, Month 선택
select(hflights_df, Year:ArrTime) #Year부터 ArrTime까지 선택
select(hflights_df, -(Year:ArrTime)) #Year부터 ArrTime 까지를 제외하고 선택

dplyr - 3번 mutate() 를 이용한 column 추가

예를 들어, ArrDelay-DepDelay를 계산한 값을 계산해서 gain이라는 값을 계산하여 새로 column을 추가하고 싶으면?

mutate(hflights_df, gain = ArrDelay - DepDelay)
## # A tibble: 227,496 x 22
##     Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier
##    <int> <int>      <int>     <int>   <int>   <int>         <chr>
## 1   2011     1          1         6    1400    1500            AA
## 2   2011     1          2         7    1401    1501            AA
## 3   2011     1          3         1    1352    1502            AA
## 4   2011     1          4         2    1403    1513            AA
## 5   2011     1          5         3    1405    1507            AA
## 6   2011     1          6         4    1359    1503            AA
## 7   2011     1          7         5    1359    1509            AA
## 8   2011     1          8         6    1355    1454            AA
## 9   2011     1          9         7    1443    1554            AA
## 10  2011     1         10         1    1443    1553            AA
## # ... with 227,486 more rows, and 15 more variables: FlightNum <int>,
## #   TailNum <chr>, ActualElapsedTime <int>, AirTime <int>, ArrDelay <int>,
## #   DepDelay <int>, Origin <chr>, Dest <chr>, Distance <int>,
## #   TaxiIn <int>, TaxiOut <int>, Cancelled <int>, CancellationCode <chr>,
## #   Diverted <int>, gain <int>

추가로, mutate의 특징은 계산한 gain을 이용해서 gain_per_hour를 계산하고 싶을 경우 아래와 같이 한 줄로 코딩이 가능하다는 점이다.

mutate(hflights_df, gain = ArrDelay - DepDelay,
       gain_per_hour = gain/(AirTime/60))
## # A tibble: 227,496 x 23
##     Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier
##    <int> <int>      <int>     <int>   <int>   <int>         <chr>
## 1   2011     1          1         6    1400    1500            AA
## 2   2011     1          2         7    1401    1501            AA
## 3   2011     1          3         1    1352    1502            AA
## 4   2011     1          4         2    1403    1513            AA
## 5   2011     1          5         3    1405    1507            AA
## 6   2011     1          6         4    1359    1503            AA
## 7   2011     1          7         5    1359    1509            AA
## 8   2011     1          8         6    1355    1454            AA
## 9   2011     1          9         7    1443    1554            AA
## 10  2011     1         10         1    1443    1553            AA
## # ... with 227,486 more rows, and 16 more variables: FlightNum <int>,
## #   TailNum <chr>, ActualElapsedTime <int>, AirTime <int>, ArrDelay <int>,
## #   DepDelay <int>, Origin <chr>, Dest <chr>, Distance <int>,
## #   TaxiIn <int>, TaxiOut <int>, Cancelled <int>, CancellationCode <chr>,
## #   Diverted <int>, gain <int>, gain_per_hour <dbl>

dplyr - 4번 arrange() 를 활용한 정렬

문법 : arrange(데이터, 정렬기준으로 하고 싶은 column명)

arrange(hflights_df, Month, Year) #Month를 1차, Year를 2차 기준으로 오름차순 정렬
## # A tibble: 227,496 x 21
##     Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier
##    <int> <int>      <int>     <int>   <int>   <int>         <chr>
## 1   2011     1          1         6    1400    1500            AA
## 2   2011     1          2         7    1401    1501            AA
## 3   2011     1          3         1    1352    1502            AA
## 4   2011     1          4         2    1403    1513            AA
## 5   2011     1          5         3    1405    1507            AA
## 6   2011     1          6         4    1359    1503            AA
## 7   2011     1          7         5    1359    1509            AA
## 8   2011     1          8         6    1355    1454            AA
## 9   2011     1          9         7    1443    1554            AA
## 10  2011     1         10         1    1443    1553            AA
## # ... with 227,486 more rows, and 14 more variables: FlightNum <int>,
## #   TailNum <chr>, ActualElapsedTime <int>, AirTime <int>, ArrDelay <int>,
## #   DepDelay <int>, Origin <chr>, Dest <chr>, Distance <int>,
## #   TaxiIn <int>, TaxiOut <int>, Cancelled <int>, CancellationCode <chr>,
## #   Diverted <int>
arrange(hflights_df, desc(Month)) #내림차순 정렬
## # A tibble: 227,496 x 21
##     Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier
##    <int> <int>      <int>     <int>   <int>   <int>         <chr>
## 1   2011    12         15         4    2113    2217            AA
## 2   2011    12         16         5    2004    2128            AA
## 3   2011    12         18         7    2007    2113            AA
## 4   2011    12         19         1    2108    2223            AA
## 5   2011    12         20         2    2008    2107            AA
## 6   2011    12         21         3    2025    2124            AA
## 7   2011    12         22         4    2021    2118            AA
## 8   2011    12         23         5    2015    2118            AA
## 9   2011    12         26         1    2013    2118            AA
## 10  2011    12         27         2    2007    2123            AA
## # ... with 227,486 more rows, and 14 more variables: FlightNum <int>,
## #   TailNum <chr>, ActualElapsedTime <int>, AirTime <int>, ArrDelay <int>,
## #   DepDelay <int>, Origin <chr>, Dest <chr>, Distance <int>,
## #   TaxiIn <int>, TaxiOut <int>, Cancelled <int>, CancellationCode <chr>,
## #   Diverted <int>

dplyr - 5번 summarise() 를 이용한 요약

hflights_df 데이터셋의 delay, Cancelled column에 대해 각각 평균을 계산하고 싶다면,

summarise(hflights_df, 
          Delay = mean(DepDelay, na.rm = TRUE),
          Cancel_rate = mean(Cancelled))
## # A tibble: 1 x 2
##      Delay Cancel_rate
##      <dbl>       <dbl>
## 1 9.444951  0.01306836

dplyr - 6번 group_by()

비행기 고유 번호인 tailnum가 있는데, 각 비행기의 비행 횟수, 평균 이동거리, 평균 delay 등을 계산하고 싶다. 이러한 경우 group_by와 summary를 같이 사용하면 결과를 얻을 수 있다.

by_tailnum <- group_by(hflights_df, TailNum)
by_tailnum
## Source: local data frame [227,496 x 21]
## Groups: TailNum [3,320]
## 
##     Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier
## *  <int> <int>      <int>     <int>   <int>   <int>         <chr>
## 1   2011     1          1         6    1400    1500            AA
## 2   2011     1          2         7    1401    1501            AA
## 3   2011     1          3         1    1352    1502            AA
## 4   2011     1          4         2    1403    1513            AA
## 5   2011     1          5         3    1405    1507            AA
## 6   2011     1          6         4    1359    1503            AA
## 7   2011     1          7         5    1359    1509            AA
## 8   2011     1          8         6    1355    1454            AA
## 9   2011     1          9         7    1443    1554            AA
## 10  2011     1         10         1    1443    1553            AA
## # ... with 227,486 more rows, and 14 more variables: FlightNum <int>,
## #   TailNum <chr>, ActualElapsedTime <int>, AirTime <int>, ArrDelay <int>,
## #   DepDelay <int>, Origin <chr>, Dest <chr>, Distance <int>,
## #   TaxiIn <int>, TaxiOut <int>, Cancelled <int>, CancellationCode <chr>,
## #   Diverted <int>
delay <- summarise(by_tailnum,
                   count = n(), #n() : 각 그룹에서 row 개수
                   dist = mean(Distance, na.rm = TRUE),
                   delay = mean(ArrDelay, na.rm = TRUE))
delay
## # A tibble: 3,320 x 4
##    TailNum count      dist     delay
##      <chr> <int>     <dbl>     <dbl>
## 1            795  938.7157       NaN
## 2   N0EGMQ    40 1095.2500  1.918919
## 3   N10156   317  801.7192  8.199357
## 4   N10575    94  631.5319 18.148936
## 5   N11106   308  774.9805 10.101639
## 6   N11107   345  768.1130  8.052786
## 7   N11109   331  772.4532 10.280000
## 8   N11113   282  772.8298  4.057143
## 9   N11119   130  790.2385  7.396825
## 10  N11121   333  774.8018  6.740854
## # ... with 3,310 more rows
참고로 알아두세요
mutate_each() / summarise_each()
#dplyr - mutate_each()
#_each 함수를 이용하면 여러 변수에 대해 요약값을 계산해 column에 추가할 수 있음
summarized <- mutate_each(by_tailnum, funs(min, max),
                          Distance)

#dplyr - summarise_each()
summarise_each(by_tailnum, funs(min, max, median), 
               Distance)

Quiz

1)에서 4)까지 이어지는 문제입니다. 차례대로 풀어보세요.

  1. iris 데이터에서 setosa 종만 뽑고,

  2. Sepal.Length와 Sepal.Width column을 추출한 후,

  3. 두 변수를 더한 값을 새로운 변수 Sepal_sum 을 만들고, 동시에 Sepal_sum을 제곱한 변수 Sepal_square 도 column에 추가하고

  4. 추가한 Sepal_sum을 기준으로 내림차순 정렬하시오.

Chain 기능 %>% 활용하기

R은 특별한 기능이 있습니다. 바로 Chain 인데요. %>% (단축키 : Ctrl Shift m) 직관적이고 간결한 코드를 작성할 수 있습니다. 위의 퀴즈 문제를 해결하기 위해서 4단계를 거쳤는데 이를 아래와 같이 한 줄로 작성할 수 있습니다.

data <- iris %>% 
  filter(Species == 'setosa') %>% 
  select(Sepal.Length, Sepal.Width) %>% 
  mutate(Sepal_sum = Sepal.Length + Sepal.Width, 
         Sepal_square = Sepal_sum^2) %>% 
  arrange(desc(Sepal_sum))
data
##    Sepal.Length Sepal.Width Sepal_sum Sepal_square
## 1           5.7         4.4      10.1       102.01
## 2           5.8         4.0       9.8        96.04
## 3           5.5         4.2       9.7        94.09
## 4           5.7         3.8       9.5        90.25
## 5           5.4         3.9       9.3        86.49
## 6           5.4         3.9       9.3        86.49
## 7           5.2         4.1       9.3        86.49
## 8           5.4         3.7       9.1        82.81
## 9           5.5         3.5       9.0        81.00
## 10          5.3         3.7       9.0        81.00
## 11          5.1         3.8       8.9        79.21
## 12          5.1         3.8       8.9        79.21
## 13          5.1         3.8       8.9        79.21
## 14          5.4         3.4       8.8        77.44
## 15          5.1         3.7       8.8        77.44
## 16          5.4         3.4       8.8        77.44
## 17          5.2         3.5       8.7        75.69
## 18          5.1         3.5       8.6        73.96
## 19          5.0         3.6       8.6        73.96
## 20          5.1         3.5       8.6        73.96
## 21          5.2         3.4       8.6        73.96
## 22          4.9         3.6       8.5        72.25
## 23          5.1         3.4       8.5        72.25
## 24          5.0         3.5       8.5        72.25
## 25          5.0         3.5       8.5        72.25
## 26          5.0         3.4       8.4        70.56
## 27          5.0         3.4       8.4        70.56
## 28          5.1         3.3       8.4        70.56
## 29          5.0         3.3       8.3        68.89
## 30          4.8         3.4       8.2        67.24
## 31          4.6         3.6       8.2        67.24
## 32          4.8         3.4       8.2        67.24
## 33          5.0         3.2       8.2        67.24
## 34          4.6         3.4       8.0        64.00
## 35          4.9         3.1       8.0        64.00
## 36          5.0         3.0       8.0        64.00
## 37          4.9         3.1       8.0        64.00
## 38          4.9         3.0       7.9        62.41
## 39          4.7         3.2       7.9        62.41
## 40          4.7         3.2       7.9        62.41
## 41          4.8         3.1       7.9        62.41
## 42          4.8         3.0       7.8        60.84
## 43          4.8         3.0       7.8        60.84
## 44          4.6         3.2       7.8        60.84
## 45          4.6         3.1       7.7        59.29
## 46          4.4         3.2       7.6        57.76
## 47          4.4         3.0       7.4        54.76
## 48          4.4         2.9       7.3        53.29
## 49          4.3         3.0       7.3        53.29
## 50          4.5         2.3       6.8        46.24

Quiz

Cars93 데이터를 활용해서 dplyr를 연습해 봅시다.

install.packages("MASS")
library(MASS)
## 
## Attaching package: 'MASS'
## The following object is masked from 'package:dplyr':
## 
##     select
str(Cars93)
## 'data.frame':    93 obs. of  27 variables:
##  $ Manufacturer      : Factor w/ 32 levels "Acura","Audi",..: 1 1 2 2 3 4 4 4 4 5 ...
##  $ Model             : Factor w/ 93 levels "100","190E","240",..: 49 56 9 1 6 24 54 74 73 35 ...
##  $ Type              : Factor w/ 6 levels "Compact","Large",..: 4 3 1 3 3 3 2 2 3 2 ...
##  $ Min.Price         : num  12.9 29.2 25.9 30.8 23.7 14.2 19.9 22.6 26.3 33 ...
##  $ Price             : num  15.9 33.9 29.1 37.7 30 15.7 20.8 23.7 26.3 34.7 ...
##  $ Max.Price         : num  18.8 38.7 32.3 44.6 36.2 17.3 21.7 24.9 26.3 36.3 ...
##  $ MPG.city          : int  25 18 20 19 22 22 19 16 19 16 ...
##  $ MPG.highway       : int  31 25 26 26 30 31 28 25 27 25 ...
##  $ AirBags           : Factor w/ 3 levels "Driver & Passenger",..: 3 1 2 1 2 2 2 2 2 2 ...
##  $ DriveTrain        : Factor w/ 3 levels "4WD","Front",..: 2 2 2 2 3 2 2 3 2 2 ...
##  $ Cylinders         : Factor w/ 6 levels "3","4","5","6",..: 2 4 4 4 2 2 4 4 4 5 ...
##  $ EngineSize        : num  1.8 3.2 2.8 2.8 3.5 2.2 3.8 5.7 3.8 4.9 ...
##  $ Horsepower        : int  140 200 172 172 208 110 170 180 170 200 ...
##  $ RPM               : int  6300 5500 5500 5500 5700 5200 4800 4000 4800 4100 ...
##  $ Rev.per.mile      : int  2890 2335 2280 2535 2545 2565 1570 1320 1690 1510 ...
##  $ Man.trans.avail   : Factor w/ 2 levels "No","Yes": 2 2 2 2 2 1 1 1 1 1 ...
##  $ Fuel.tank.capacity: num  13.2 18 16.9 21.1 21.1 16.4 18 23 18.8 18 ...
##  $ Passengers        : int  5 5 5 6 4 6 6 6 5 6 ...
##  $ Length            : int  177 195 180 193 186 189 200 216 198 206 ...
##  $ Wheelbase         : int  102 115 102 106 109 105 111 116 108 114 ...
##  $ Width             : int  68 71 67 70 69 69 74 78 73 73 ...
##  $ Turn.circle       : int  37 38 37 37 39 41 42 45 41 43 ...
##  $ Rear.seat.room    : num  26.5 30 28 31 27 28 30.5 30.5 26.5 35 ...
##  $ Luggage.room      : int  11 15 14 17 13 16 17 21 14 18 ...
##  $ Weight            : int  2705 3560 3375 3405 3640 2880 3470 4105 3495 3620 ...
##  $ Origin            : Factor w/ 2 levels "USA","non-USA": 2 2 2 2 2 1 1 1 1 1 ...
##  $ Make              : Factor w/ 93 levels "Acura Integra",..: 1 2 4 3 5 6 7 9 8 10 ...
head(Cars93)
##   Manufacturer   Model    Type Min.Price Price Max.Price MPG.city
## 1        Acura Integra   Small      12.9  15.9      18.8       25
## 2        Acura  Legend Midsize      29.2  33.9      38.7       18
## 3         Audi      90 Compact      25.9  29.1      32.3       20
## 4         Audi     100 Midsize      30.8  37.7      44.6       19
## 5          BMW    535i Midsize      23.7  30.0      36.2       22
## 6        Buick Century Midsize      14.2  15.7      17.3       22
##   MPG.highway            AirBags DriveTrain Cylinders EngineSize
## 1          31               None      Front         4        1.8
## 2          25 Driver & Passenger      Front         6        3.2
## 3          26        Driver only      Front         6        2.8
## 4          26 Driver & Passenger      Front         6        2.8
## 5          30        Driver only       Rear         4        3.5
## 6          31        Driver only      Front         4        2.2
##   Horsepower  RPM Rev.per.mile Man.trans.avail Fuel.tank.capacity
## 1        140 6300         2890             Yes               13.2
## 2        200 5500         2335             Yes               18.0
## 3        172 5500         2280             Yes               16.9
## 4        172 5500         2535             Yes               21.1
## 5        208 5700         2545             Yes               21.1
## 6        110 5200         2565              No               16.4
##   Passengers Length Wheelbase Width Turn.circle Rear.seat.room
## 1          5    177       102    68          37           26.5
## 2          5    195       115    71          38           30.0
## 3          5    180       102    67          37           28.0
## 4          6    193       106    70          37           31.0
## 5          4    186       109    69          39           27.0
## 6          6    189       105    69          41           28.0
##   Luggage.room Weight  Origin          Make
## 1           11   2705 non-USA Acura Integra
## 2           15   3560 non-USA  Acura Legend
## 3           14   3375 non-USA       Audi 90
## 4           17   3405 non-USA      Audi 100
## 5           13   3640 non-USA      BMW 535i
## 6           16   2880     USA Buick Century

Quiz

  1. Cars93의 데이터를 활용하여 Manufacturer가 Chevrolet, Ford인 데이터를 선택한 후 Chervolet, Ford별 차량 대수와 Price의 평균과 표준편차를 계산하시오.
## # A tibble: 2 x 4
##   Manufacturer count Price.mean Price.std
##         <fctr> <int>      <dbl>     <dbl>
## 1    Chevrolet     8    18.1875  8.304463
## 2         Ford     8    14.9625  5.114667
  1. Max.Price(프리미엄 버젼 가격) - Min.Price(기본 버젼 가격)의 차이를 계산하여 Price.Diff 라는 column을 추가하고, Price.Diff 를 기준으로 내림차순 정렬하시오. 그리고, Manufacturer, Model, Type, Price.Diff column만 선택하시오.
##    Manufacturer    Model    Type Price.Diff
## 1 Mercedes-Benz     300E Midsize       36.2
## 2          Saab      900 Compact       16.8
## 3         Dodge  Stealth  Sporty       14.6
## 4          Audi      100 Midsize       13.8
## 5           BMW     535i Midsize       12.5
## 6          Ford Aerostar     Van       10.8


Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.