아이티월 수업일지(R)

22-08-09 chap06_1_Datahandling

서부남93 2022. 8. 9. 16:02

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]