59doit
[ R ] dplyr 패키지 활용 #1 본문
반응형
install.packages("dplyr")
library(dplyr)
dplyr 패키지 활용
dplyr 패키지는 데이터프레임 자료구조를 갖는 데이터를 처리하는데 적합한 패키지
(1) 파이프 연산자(%>%)를 이용한 함수 적용
- 데이터프레임을 조작하는데 필요한 함수를 순차적으로 적용할 경우 사용할 수 있는 연산자
- dataframe %>% 함수1() %>% 함수2()
- %>% 연산자는 인수를 함수에 편하게 적용할 수 있다.
- %>% 연산자의 >(라이트 앵글 브래킷) 기호는 방향의 의미로 왼쪽에 있는 인자를 오른쪽에 있는 함수에 집어넣는 것이 파이프라인의 기능이다.
- %>% 연산자를 사용하면 여러 가지 함수를 한 번에 사용할 수 있다.
- %>% 함수의 큰 장점은 한 번에 한 줄로 코드를 사용할 수 있으므로 함수를 사용할 때마다 따로 저장하는 과정이 없이 여러 함수를 실행할 수 있는 편리성에 있다.
- %>% 연산자에서 왼쪽 %(퍼센트)를 LHS(Left Hand Side) 변수라고 하며 오른쪽 %(퍼센트)를 RHS(Right Hand Side) 변수라고 한다.
ex ) iris 데이터셋을 대상으로 ‘%>%’연산자를 이용하여 함수 적용
#1 패키지 설치
install.packages("dplyr") library(dplyr) install.packages("lifecycle",type='binary') library(lifecycle) install.packages("pillar",type='binary') library(pillar) |
#2
iris %>% head() # Sepal.Length Sepal.Width Petal.Length Petal.Width Species # 1 5.1 3.5 1.4 0.2 setosa # 2 4.9 3.0 1.4 0.2 setosa # 3 4.7 3.2 1.3 0.2 setosa # 4 4.6 3.1 1.5 0.2 setosa # 5 5.0 3.6 1.4 0.2 setosa # 6 5.4 3.9 1.7 0.4 setosa iris %>% head() %>% subset(Sepal.Length >= 5.0) # Sepal.Length Sepal.Width Petal.Length Petal.Width Species # 1 5.1 3.5 1.4 0.2 setosa # 5 5.0 3.6 1.4 0.2 setosa # 6 5.4 3.9 1.7 0.4 setosa |
- %>% 함수의 도트(.) 연산자 도트(.) 연산자를 사용하여 LHS가 들어갈 위치를 정할 수 있다. 도트(.) 연산자는 저장한 인자의 이름을 다시 쓰지 않고 데이터를 사용할 수 있다.
(2) 콘솔 창의 크기에 맞게 데이터 추출
- 데이터 셋을 대상으로 콘솔 창의 크기에 맞게 데이터를 추출하고, 나머지는 축약형으로 제공
ex ) dplyr 패키지와 hflights 데이터 셋 설치
install.packages(c("dplyr", "hflights")) library(dplyr) library(hflights) |
ex ) hflights 데이터 셋 구조 보기
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 ... |
ex ) tbl_df()함수 사용하기
hflights_df <- tbl_df(hflights) hflights_df # Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier FlightNum TailNum # <int> <int> <int> <int> <int> <int> <chr> <int> <chr> # 1 2011 1 1 6 1400 1500 AA 428 N576AA # 2 2011 1 2 7 1401 1501 AA 428 N557AA # 3 2011 1 3 1 1352 1502 AA 428 N541AA # 4 2011 1 4 2 1403 1513 AA 428 N403AA # 5 2011 1 5 3 1405 1507 AA 428 N492AA # 6 2011 1 6 4 1359 1503 AA 428 N262AA # 7 2011 1 7 5 1359 1509 AA 428 N493AA # 8 2011 1 8 6 1355 1454 AA 428 N477AA # 9 2011 1 9 7 1443 1554 AA 428 N476AA # 10 2011 1 10 1 1443 1553 AA 428 N504AA |
- tbl_df()함수: 현재 R의 console창 크기에서 볼수 있는 만큼 결과를 나타내고, 나머지는 아래에 생략된 행 수와 컬럼명 표시
- hflights <- hflights %>% tbl_df() 형태로 tbl_df()함수 적용
(3) 조건에 맞는 데이터 필터링
- dplyr 패키지의 filter 함수를 사용하여 조건에 맞는 데이터만 추출한다.
- filter 함수는 조건에 해당하는 데이터의 모든 컬럼을 추출한다
- filter(dataframe, 조건1, 조건2)
ex ) ==(더블 이퀄) 연산자
library(dplyr) csvgrade <- read.csv("C:/grade_csv.csv") csvgrade %>% filter(class == 1) # id class math eng sci # 1 1 1 50 50 70 # 2 7 1 90 90 70 # 3 10 1 60 80 60 |
- == 연산자를 적용하여 객체의 특정값을 호출한다.
ex ) !=(엑스클러메이션 포인트 이퀄) 연산자
library(dplyr) csvgrade <- read.csv("C:/grade_csv.csv") csvgrade %>% filter(class != 1) # id class math eng sci # 1 2 2 20 60 80 # 2 3 3 80 70 90 # 3 4 3 50 80 90 # 4 5 2 40 30 90 # 5 6 2 80 90 80 # 6 8 3 80 90 70 # 7 9 2 90 60 50 |
- != 연산자를 적용하여 객체의 특정값인 아닌 나머지 값들을 호출한다
ex ) >(라이트 앵글 브래킷) 연산자
library(dplyr) csvgrade <- read.csv("C:/grade_csv.csv") csvgrade %>% filter(math > 50) # id class math eng sci # 1 3 3 80 70 90 # 2 6 2 80 90 80 # 3 7 1 90 90 70 # 4 8 3 80 90 70 # 5 9 2 90 60 50 # 6 10 1 60 80 60 |
- > 연산자를 적용하여 객체의 특정값 초과인 값들을 호출한다
ex ) <(레프트 앵글 브래킷) 연산자
library(dplyr) csvgrade <- read.csv("C:/grade_csv.csv") csvgrade %>% filter(math < 50) # id class math eng sci # 1 2 2 20 60 80 # 2 5 2 40 30 90 |
- < 연산자를 적용하여 객체의 특정값 미만인 값들을 호출한다.
ex ) >=(라이트 앵글 브래킷 이퀄) 연산자
library(dplyr) csvgrade <- read.csv("C:/grade_csv.csv") csvgrade %>% filter(eng >= 80) # id class math eng sci # 1 4 3 50 80 90 # 2 6 2 80 90 80 # 3 7 1 90 90 70 # 4 8 3 80 90 70 # 5 10 1 60 80 60 |
- >= 연산자를 적용하여 객체의 특정값 이상인 값들을 호출한다
ex ) <=(레프트 앵글 브래킷 이퀄) 연산자
library(dplyr) csvgrade <- read.csv("C:/grade_csv.csv") csvgrade %>% filter(eng <= 80) # id class math eng sci # 1 1 1 50 50 70 # 2 2 2 20 60 80 # 3 3 3 80 70 90 # 4 4 3 50 80 90 # 5 5 2 40 30 90 # 6 9 2 90 60 50 # 7 10 1 60 80 60 |
- <= 연산자를 적용하여 객체의 특정값 이하인 값들을 호출한다
ex ) &(앰퍼샌드) 연산자
csvgrade <- read.csv("C:/grade_csv.csv") csvgrade %>% filter(class == 1 & math >= 50) # id class math eng sci # 1 1 1 50 50 70 # 2 7 1 90 90 70 # 3 10 1 60 80 60 |
- & 연산자는 객체를 평가하고 객체 모두 TRUE일 때 TRUE로 평가하고 그렇지 않으면 FALSE로 평가한다.
- & 연산자를 적용하여 여러 조건을 충족하는 행을 추출한다.
ex ) |(버티컬바) 연산자
- | 연산자는 객체를 평가하고 객체가 모두 FALSE일 때 FALSE로 평가하고 그렇지 않으면 TRUE로 평가한다.
library(dplyr) csvgrade <- read.csv("C:/grade_csv.csv") csvgrade %>% filter(eng < 90 | sci < 50) # id class math eng sci # 1 1 1 50 50 70 # 2 2 2 20 60 80 # 3 3 3 80 70 90 # 4 4 3 50 80 90 # 5 5 2 40 30 90 # 6 9 2 90 60 50 # 7 10 1 60 80 60 |
- | 연산자를 적용하여 여러 조건 중 하나 이상 충족하는 행을 추출한다
library(dplyr) csvgrade <- read.csv("C:/grade_csv.csv") csvgrade %>% filter(class == 1 | class == 3 | class == 5) # id class math eng sci # 1 1 1 50 50 70 # 2 3 3 80 70 90 # 3 4 3 50 80 90 # 4 7 1 90 90 70 # 5 8 3 80 90 70 # 6 10 1 60 80 60 |
- | 연산자를 적용하여 목록에 해당하는 행을 추출한다.
ex ) %in% 연산자
library(dplyr) csvgrade <- read.csv("C:/grade_csv.csv") csvgrade %>% filter(class %in% c(1, 3, 5)) # id class math eng sci # 1 1 1 50 50 70 # 2 3 3 80 70 90 # 3 4 3 50 80 90 # 4 7 1 90 90 70 # 5 8 3 80 90 70 # 6 10 1 60 80 60 |
- %in% 연산자는 값의 포함 여부를 확인하고 반환한다.
- %in% 연산자는 여러 객체에서 여러 조건을 줄 때는 사용할 수 없다.
- 포함된 데이터를 추출하여 반환한다.
ex ) 객체 생성
# 객체 생성 class1 <- csvgrade %>% filter(class == 1) # class1 객체의 math 컬럼에 접근하여 평균 산출 mean(class1$math) # [1] 66.66667 # class1 객체의 english 컬럼에 접근하여 평균 산출 mean(class1$english) # [1] 73.33333 # class1 객체의 science 컬럼에 접근하여 평균 산출 mean(class1$science) # [1] 66.66667 |
- 필터링한 데이터의 객체를 생성한다.
- 데이터의 객체를 생성하여 반환한다.
ex ) hflights_df를 대상으로 특정일의 데이터 추출하기
- 파이프연산자(%>%)사용하여 hflights_df데이터 셋에 filter()함수
# 1월 2일 데이터 추출
filter(hflights_df, Month == 1 & DayofMonth == 2) # Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier FlightNum TailNum # # 1 2011 1 2 7 1401 1501 AA 428 N557AA # 2 2011 1 2 7 719 821 AA 460 N537AA # 3 2011 1 2 7 1959 2106 AA 533 N461AA # 4 2011 1 2 7 1636 1759 AA 1121 N579AA # 5 2011 1 2 7 1823 2132 AA 1294 N3CCAA # 6 2011 1 2 7 1008 1321 AA 1700 N3ASAA # 7 2011 1 2 7 1200 1303 AA 1820 N589AA # 8 2011 1 2 7 907 1018 AA 1824 N569AA # 9 2011 1 2 7 554 912 AA 1994 N3DCAA # 10 2011 1 2 7 1823 2103 AS 731 N627AS |
ex ) hflight_df 대상으로 지정된 월의 데이터 추출
# 1월 또는 2월 데이터 추출
filter(hflights_df, Month == 1 | Month == 2) # 1월 또는 2월 데이터 추출 # Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier FlightNum TailNum # <int> <int> <int> <int> <int> <int> <chr> <int> <chr> # 1 2011 1 1 6 1400 1500 AA 428 N576AA # 2 2011 1 2 7 1401 1501 AA 428 N557AA # 3 2011 1 3 1 1352 1502 AA 428 N541AA # 4 2011 1 4 2 1403 1513 AA 428 N403AA # 5 2011 1 5 3 1405 1507 AA 428 N492AA # 6 2011 1 6 4 1359 1503 AA 428 N262AA # 7 2011 1 7 5 1359 1509 AA 428 N493AA # 8 2011 1 8 6 1355 1454 AA 428 N477AA # 9 2011 1 9 7 1443 1554 AA 428 N476AA # 10 2011 1 10 1 1443 1553 AA 428 N504AA |
반응형
'Programming > R' 카테고리의 다른 글
[ R ] dplyr 패키지 활용 #3 (0) | 2022.11.19 |
---|---|
[ R ] dplyr 패키지 활용 #2 (0) | 2022.11.19 |
[ R ] 주요 내장함수 (0) | 2022.11.18 |
[ R ] 함수의 정의 (0) | 2022.11.18 |
[ R ] 연산자 & 조건문 & 반복문 (0) | 2022.11.17 |
Comments