# chap06_Datahandling
# 데이터 조작
# 1. dplyr 패키지 ( filter, arrange, select, mutate, summarise, group_by 등)
# 2. reshape2 ( dcast, melt )
###########################
## 1. dplyr 패키지
###########################
install.packages("dplyr")
library(dplyr)
# 1) %>% 기호 : 함수 나열 기능
# 형식) df %>% func1() %>% func2()
iris %>% head() %>% filter(Sepal.Length >= 5.0) # head(iris)
# 2) tbl_df()함수 : 콘솔 크기에 맞는 데이터 구성
iris
iris_df <- tbl_df(iris)
iris_df
# 항공 운항에 관련된 dataset
install.packages("hflights")
library(hflights)
data(hflights)
dim(hflights) # 227496 21
hflights
hflights_df <- tbl_df(hflights)
hflights_df
# 3) filter() 함수 : 행 추출
# 형식) df %>% filter(필터 조건)
names(iris)
iris %>% filter(Sepal.Width > 3) %>% head()
# 형식) filter(df, 필터조건)
filter(hflights_df, Month == 1 & DayofMonth == 1) # and
filter(hflights_df, Month == 1 | Month == 2) # or
# 4) arrange() 함수 : 특정 칼럼 기준 정렬(오름/내림)
# 형식) df %>% arrange(칼럼명)
head(iris)
iris %>% arrange(Sepal.Width) %>% head() # 오름차순
iris %>% arrange(desc(Sepal.Width)) %>% head() # 내림차순
# 형식) arrange(df, 칼럼1, 칼럼2, ...)
hflights_df
arrange(hflights_df, Year, Month, ArrTime) # 1차, 2차, 3차
arrange(hflights_df, desc(Month))
# 5) select() 함수 : 열(칼럼) 선택
# 형식) df %>% select(칼럼명)
head(iris)
iris_sub <- iris %>% select(Sepal.Length,Petal.Length,Species)
iris_sub # 1,3,5번 칼럼
# 연속 칼럼 선택(:)
iris %>% select(Sepal.Length:Petal.Length,Species)#1~3,5번
# 형식) select(df, 칼럼명)
hflights_df
select(hflights_df, DepTime, ArrTime, FlightNum)
select(hflights_df, Year:DepTime) # 범위
select(hflights_df, -(Year:DepTime)) # 해당 칼럼 제외
# 문) Month 기준으로 내림차순 정렬하여, - arrange()
# Year, Month, AirTime 칼럼 선택하기- select()
# df %>% func1() %>% func2()
hflights_df %>% arrange(desc(Month)) %>% select(Year, Month, AirTime)
# select(arrange(df, 칼럼), 칼럼)
select(arrange(hflights_df, desc(Month)), Year, Month, AirTime)
arr_re <- arrange(hflights_df, desc(Month))
select(arr_re, Year, Month, AirTime)
# 6) mutate() 함수 : 파생변수 생성하는 함수
# 형식) df %>% mutate(변수 = 식)
head(iris)
iris %>% mutate(diff = Sepal.Length - Sepal.Width,
div = diff/2.0) %>% head()
# 형식) mutate(df, 변수 = 식) : diff_delay = 도착지연 - 출발지연
hflights_df
mut_re <- mutate(hflights_df, diff_delay = ArrDelay - DepDelay)
select(mut_re, Year, Month, ArrDelay, DepDelay, diff_delay)
# 7) summarise() 함수 : 통계 처리 함수
# 형식) df %>% summarise(변수 = 통계함수)
head(iris)
iris %>% summarise(col1_avg = mean(Sepal.Length),
col2_var = var(Sepal.Width),
col3_sd = sd(Petal.Length))
# col1_avg col2_var col3_sd
#1 5.843333 0.1899794 1.765298
# 형식) summarise(df, 변수 = 통계함수) : 출발지연시간 평균, 합계
summarise(hflights_df, dep_avg = mean(DepDelay, na.rm = T),
dep_tot = sum(DepDelay, na.rm = T))
# dep_avg dep_tot
#
# 1 9.44 2121251
dep_delay <- hflights_df$DepDelay
length(dep_delay) # 227496
table(is.na(dep_delay))
# FALSE TRUE
# 224591 2905
# 8) group_by() 함수 : 집단변수 이용 그룹화
# 형식) df %>% group_by(집단변수)
head(iris)
table(iris$Species) # 집단 빈도수
unique(iris$Species) # 집단 확인
iris_g <- iris %>% group_by(Species)
# Groups: Species [3]
summarise(iris_g, count = n(),
sepal_avg = mean(Sepal.Length),
petal_avg = mean(Petal.Length))
# n() : 집단별 갯수 반환
# 형식) group_by(df, 집단변수)
# 예제) 각 항공기별 비행편수가 40편 이상이고, 평균 비행거리가
# 2,000 마일 이상인 경우 평균 도착지연시간 확인하기
# 단계1 : 항공기별 그룹화
planes <- group_by(hflights_df, TailNum) # TailNum : 항공기 일련번호
planes # # Groups: TailNum [3,320]
# 단계2 : 항공기별 요약 통계량 : 비행편수, 평균 비행거리, 평균 도착지연시간
planesInfo <- summarise(planes, count = n(),
dist_avg = mean(Distance, na.rm = T),
delay_avg = mean(ArrDelay, na.rm = T))
planesInfo
# 단계3 : 항공기별 요약 통계량 필터링
result <- filter(planesInfo, count>=40 & dist_avg>=2000)
result
# 9) left_join() 함수 : 공통 칼럼으로 df를 결합
df1 <- data.frame(x=1:5, y=rnorm(5))
df1
df2 <- data.frame(x=1:5, z=runif(5))
df2
# 형식) left_join(df1, df2)
df_join <- left_join(df1, df2) # left_join(df1, df2, by="x")
# Joining, by = "x"
df_join
# 10) bind_rows(df1, df2)
df1 <- data.frame(x=1:5, y=rnorm(5))
df2 <- data.frame(x=6:10,y=rnorm(5))
df1
df2
df_rows <- bind_rows(df1, df2)
df_rows
# 11) bind_cols(df1, df2)
df_cols <- bind_cols(df1, df2)
df_cols
# 12) rename(df, new=old)
df_cols <- rename(df_cols, x2=x1)
df_cols <- rename(df_cols, y2=y1)
df_cols
##########################
## 2. reshape2
##########################
install.packages("reshape2")
library(reshape2)
### 사용된 파일은 https://joyfuls.tistory.com/4 에서 다운 받으실 수 있습니다.
# 1) dcast() 함수 : 긴 형식 -> 넓은 형식
setwd("c:/2_Rwork/Part-II")
data <- read.csv("data.csv")
str(data) # 22행 3열
# $ Date
# $ Customer_ID
# $ Buy
head(data)
data
unique(data$Customer_ID) # 1 2 4 5 3
length(unique(data$Date)) # 7
?dcast# dcast(data, formula, func) # formula = 행 ~ 열
wide <- dcast(data, formula = Customer_ID ~ Date, sum)
# Using Buy as value column: use value.var to override
wide
str(wide) # 5행 8열
install.packages("ggplot2")
library(ggplot2) # function + dataset
data(mpg)
mpg # ggplot2 제공 dataset(자동차 연비)
mpg_sub <- mpg %>% select(cyl, drv, hwy)
str(mpg_sub) # 234 obs. of 3 variables:
# $ cyl: int 4 4 4 4 6 6 6 4 4 4 ...
# $ drv: chr "f" "f" "f" "f" ...
# $ hwy: int 29 29 31 30 26
mpg_sub
wide2 <- dcast(mpg_sub, cyl ~ drv, sum)
# cyl : 행
# drv : 열
# hwy : 셀(sum)
wide2
# cyl 4 f r
#1 4 566 1767 0
#2 5 0 115 0
#3 6 624 1078 101
#4 8 785 25 424
wide2 <- dcast(mpg_sub, cyl ~ drv, length)
wide2
# cyl 4 f r
#1 4 23 58 0
#2 5 0 4 0
#3 6 32 43 4
#4 8 48 1 21
# 교차분할표
table(mpg_sub$cyl, mpg_sub$drv)
# 2) melt() 함수 : 넓은 형식 -> 긴 형식
# 형식) melt(data, id=칼럼명)
long <- melt(data = wide, id="Customer_ID")
long
long <- long %>% rename(Date = variable)
long <- long %>% rename(Buy = value)
long
# example
data("smiths") # reshape2 제공
smiths
# wide -> long
long <- melt(smiths, id="subject")
long
melt(smiths, id=1:2)
# long -> wide
wide <- dcast(long, subject~...)
wide
'R 과 데이터분석 > 기초 문법 ~ 머신러닝' 카테고리의 다른 글
[R 데이터분석] 8장. 고급시각화 (0) | 2019.09.13 |
---|---|
[R 데이터분석] 7장. EDA & 데이터 전처리 (0) | 2019.09.13 |
[R 데이터분석] 5장. 데이터 시각화 (0) | 2019.09.13 |
[R 데이터분석] 4장. 제어문과 함수 (0) | 2019.09.13 |
[R 데이터분석] 3장. 데이터 입출력 (feat. 데이터셋 제공 사이트) (0) | 2019.09.13 |
댓글