목차
데이터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 데이터 확인]
- Tibble: 처음 몇건만 보내줌
- 행: 10건만 보여줬으니까 336,766이 더있음
- 열: 9개가 더 있음
[2. 조건에 맞는 데이터 추출]
filter(): 데이터 프레임에서 조건에 따른 레코드(row) 추출
- AND: ‘,’ 또는 ‘&’
-
OR:
filter(flights, flights$month == 1, flights$day==1)
%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())
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) ```