본문 바로가기
R 과 데이터분석/기초 문법 ~ 머신러닝

[R 데이터분석] 6장. 데이터 조작

by JoyfulS 2019. 9. 13.

# 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

댓글