22-08-09 chap06_1_Datahandling
chap06_1_Datahandling
# 1. dplyr 패키지 활용
# dplyr 패키지와
install.packages("dplyr") # plyr 패키지 업그레이드
library(dplyr)
# 1) %>% : 파이프 연산자 : df 조작에 필요한 함수 나열 기능
# 형식) df %>% func1() %>% func2()
iris %>% head() %>% filter(Sepal.Length >= 5.0)
iris
str(iris)
# 2) tibble() 함수 : 콘솔 크기에 맞는 데이터 구성
iris_df <- tibble(iris) # 콘솔 크기에 맞는 데이터 구성
iris_df
# 3) filter() 함수 : 행 추출
# 형식) df %>% filter(필터조건)
iris %>% filter(Sepal.Width > 3) %>% head()
setosa <- iris %>% filter(Species == 'setosa')
setosa
# 4) arrange()함수 : 칼럼 기준 정렬
# 형식) df %>% arrange(칼럼명)
iris %>% arrange(Sepal.Width) %>% head() # 오름차순
iris %>% arrange(Sepal.Width) %>% tail()
iris %>% arrange(desc(Sepal.Width)) %>% head() # 내림차순
#desc(칼럼명) : 내림차순
# 5) select()함수 : 열 선택
# 형식) df %>% select(칼럼명)
iris %>% select(Sepal.Length:Petal.Length, Species) %>% head()
# 6) mutate() 함수 : 파생변수(변형) 생성
# 형식) df %>% mutate(변수 = 식)
iris %>% mutate(diff = Sepal.Length - Sepal.Width) %>% head()
# 7) summarise()함수 : 통계
# 형식) df %>% summarise(변수 = 내장함수)
iris %>% summarise(col1_avg = mean(Sepal.Length),
col2_sd = sd(Sepal.Width))
# col1_avg col2_sd
# 1 5.843333 0.4358663
# 8) group_by()함수 : 집단변수 이용 그룹화
# 형식) df %>% group_by(집단변수)
iris_grp <- iris %>% group_by(Species)
iris_grp
# 그룹별 통계
summarise(iris_grp, mean(Sepal.Length), count=n())
#n(): 해당 그룹의 길이(size)
mean(iris$Sepal.Length)#5.843333
# 9) left_join() 함수 : 왼쪽 dataframe의 x칼럼 기준 열 합치기
df1 <- data.frame(x=1:5, y=rnorm(5))
df2 <- data.frame(x=1:5, z=rnorm(5))
df1
df2
df_join <- left_join(df1, df2, by='x') # x칼럼 기준 : right_join()
df_join
df2 <- subset(df2, subset= x <5)
df2
# 10) right_join() 함수 : 오른쪽 dataframe의 x칼럼 기준 열 합치기
df_join <- right_join(df1, df2, by='x') # 결과 동일
df_join
# x y z
# 1 1 -1.0959963 -1.0633261
# 2 2 0.0377884 1.2631852
# 3 3 0.3104807 -0.3496504
# 4 4 0.4365235 -0.8655129
# 11) bind_rows() : 행 합치기
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
# 12) bind_cols() : 열 합치기
df_cols <- bind_cols(df1, df2)
#group by 실습
install.packages('ggplot2')
library(datasets)
data("mtcars")
str(mtcars) # 자동차 연비 관련
# mpg 연비, cyl 실린더 , disp 크기
#조건1) 연비(mpg)의 평균과 표준편차 구하기
summarise(mtcars, mpg_avg= mean(mpg),mpg_sd =sd(mpg))
# mpg_avg mpg_sd
# 1 20.09062 6.026948
#조건2) 실린더(cyl)별 연비(mpg)의 평균과 표준편차 구하기
unique(mtcars$cyl) # 6 4 8
table(mtcars$cyl)
group_by(mtcars, cyl) %>% summarise(mpg_avg= mean(mpg),mpg_sd =sd(mpg))
# cyl mpg_avg mpg_sd
# <dbl> <dbl> <dbl>
# 1 4 26.7 4.51
# 2 6 19.7 1.45
# 3 8 15.1 2.56
#조건3) 실린더 수 / 기어수 별 mpg 의 평균과 표준편차 구하기
unique(mtcars$gear)
# step1: 그룹 객체
grp<-group_by(mtcars, cyl,gear)
# cyl gear mpg_avg mpg_sd
# <dbl> <dbl> <dbl> <dbl>
# 1 4 3 21.5 NA
# 2 4 4 26.9 4.81
# 3 4 5 28.2 3.11
# 4 6 3 19.8 2.33
# 5 6 4 19.8 1.55
# 6 6 5 19.7 NA
# 7 8 3 15.0 2.77
# 8 8 5 15.4 0.566
# step2: 요약통계
grp %>% summarise(mpg_avg= mean(mpg),mpg_sd =sd(mpg))
######################################################
# 2. reshape2 패키지 활용
######################################################
install.packages('reshape2')
library(reshape2)
# 1) dcast()함수 이용 : 긴 형식 -> 넓은 형식 변경
# - '긴 형식'(Long format)을 '넓은 형식'(wide format)으로 모양 변경
data <- read.csv(file=file.choose()) # data.csv
data
unique(data$Date)
# data.csv 데이터 셋 구성 - 22개 관측치, 3개 변수
# Date : 구매날짜
# Customer : 고객ID
# Buy : 구매수량
# (1) '넓은 형식'(wide format)으로 변형
# 형식) dcast(데이터셋, row ~ col, FUNC)
# 앞변수 : 행 구성, 뒷변수 : 칼럼 구성
wide <- dcast(data, Customer_ID ~ Date, sum) # 구매합계
wide # Buy 칼럼을 이용해서 교차셀에 합 표시
#Using Buy as value column: use value.var to override.
library(ggplot2)
#변수가 많은경우
data(mpg) #ggplot2 제공 dataset
names(mpg) #cyl vs drv
#mpg subset
mpg_df <- subset(mpg,select = c("cyl","drv","hwy"))
mpg_df
# 행:cyl , 열:drv , 셀 : hwy
dcast(mpg_df,cyl~drv,sum)
# 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(data, Customer_ID ~ Date, length) # 구매횟수
wide2
# 2) melt() 함수 이용 : 넓은 형식 -> 긴 형식 변경
# 형식) melt(data, id='열이름')
# - 긴 형식 변경
long <- melt(wide, id='Customer_ID') # 5*7 = 35
long
# Customer_ID variable value
# id변수를 기준으로 넓은 형식이 긴 형식으로 변경
# 칼럼명 수정
name <- c("Customer_ID", "Date", "Buy")
colnames(long) <- name
head(long)
# 3. acast() 함수 : 3차원 형식으로 모양변경
# 형식) acast(dataset,행~ 열~ 면)
library(datasets)
#data.frame': 153 obs. of 6 variables
data("airquality")
airquality
str(airquality)
head(airquality)
unique(airquality$Month)
#5 6 7 8 9
tail(airquality)
# 월 기준 나머지 4개 칼럼 묶기
air_month<- melt(airquality,id=c('Month','Day'))
head(air_month)
tail(air_month)
# variable: 나머지 4개 칼럼명
# value: 칼럼의 값
dim(air_month) #[1] 612 4
#[일~월 ~ variable] 칼럼으로 3차원 변형
table(air_month$variable)
air_3d <-acast(air_month, Day~ Month~ variable)
dim(air_3d)
air_3d
#ozone
air_3d[,,1]
#Solar.R
air_3d[,,2]
#wind
air_3d[,,3]
#Temp
air_3d[,,4]