Lecture 20 - 모듈화,재활용,자동화
#########################
# transform: 변수값에 대한 연산결과를 데이터 프레임의 다른 변수에 저장하는 함수
# subset: 전체컬럼 중 특정 컬럼 부분만 취하는 용도로 사용
# substr: Extract or replace substrings in a character vector.
################### Step 1. dull way #####################
#### 함수 정의 --> Data 읽기 --> cleaning --> 합치기 ####
###########################################################
#### 첫번째 파일 처리하기 ####
cleanse1<-function(df){
df<-transform(df,date=as.integer(substr(date,7,8))) # convert date column: 년월은 제거, 숫자화
df<-subset(df,select=c("date","temp")) # select relevant columns: region은 제거
return(df)
}
#### 두번째 파일 처리하기 ####
cleanse2<-function(df){
df<-transform(df,dt=as.integer(substr(dt,7,8))) # convert date column: 년월은 제거 , 숫자화
df<-subset(df,select=c("dt","temperature")) # select relevant columns: 경위도 제거
colnames(df)<-c("date","temp") # rename columns: 컬럼명 맞추기
return(df)
}
#### 세번째 파일 처리하기 ####
cleanse3<-function(df){
df<-transform(df,month.and.date=as.integer(substr(month.and.date,5,6)))
# convert date column: 영문월 제거, 숫자화
df<-transform(df,fahrenheit=(fahrenheit-32)/1.8) # convert tempt celsius: 섭씨 환산
df<-subset(df,select=c("month.and.date","fahrenheit")) # select relevant columns
colnames(df)<-c("date","temp") # rename columns: 컬럼명 맞추기
return(df)
}
#### 합치기####
# read rawdata
raw1<-read.csv("temp01.csv")
raw2<-read.csv("temp02.csv")
raw3<-read.csv("temp03.csv")
# cleanse
clean1<-cleanse1(raw1)
clean2<-cleanse2(raw2)
clean3<-cleanse3(raw3)
# bind
result<-rbind(clean1,clean2,clean3)
################### Step 2. Module화 #######################
#### 지향점: 중복을 제거하고 의도를 드러내기 ####
#### 중복을 들어내기(remove) 전에 중복을 드러내기(reveal) ####
##############################################################
#### 답답한 방식 ####
cleanse1<-function(df){
cols<-c("date","temp") # select relevant columns
df<-subset(df,select=cols) # rename columns : region 제거
colnames(df)<-c("date","temp") # convert date column : 컬럼명 맞추기
df<-transform(df,date=as.integer(substr(date,7,8))) # 년월 제거
return(df)
}
#### 중복 들어내기 #1: sameform 함수 ####
sameform<-function(df,colnames){ # 컬럼명을 받아서
df<-subset(df,select=colnames) # 그 컬럼만 남기고
colnames(df)<-c("date","temp") # 컬럼명을 맞춘다
return(df)
}
#### 중복 들어내기 #2: 화씨를 섭씨로 & 년월제거 ####
conv.f2c<-function(df){
return(transform(df,temp=((temp-32)/1.8))) # 섭씨로 환산
}
conv.date1<-function(df){
return(transform(df,date=as.integer(substr(date,7,8)))) # 년월 제거, 숫자화 for raw1
}
conv.date2<-function(df){
return(transform(df,date=as.integer(substr(date,5,6)))) # 년월 제거, 숫자화 for raw2
}
#### cleanse1, cleanse2, cleans3이 하는 일이 거의 비슷해졌다. ####
#### 조금 더 비슷해지도록 중복을 드러내자(reveal) ####
cleanse1<-function(df){
names<-c("date","temp")
convs<-c(conv.date1) # 함수도 벡터처럼 취급 가능
df<-sameform(df,names) # sameform 함수를 통해 해당 컬럼만 남기고 컮럼명 맞춤
for(conv in convs) df<-conv(df) # conv함수로 년월 제거, 숫자화
return(df)
}
cleanse2<-function(df){
names<-c("dt","temperature") # 위 1과 같으나 컬럼명만 다름
convs<-c(conv.date1)
df<-sameform(df,names)
for(conv in convs) df<-conv(df)
return(df)
}
cleanse3<-function(df){
names<-c("month.and.date","fahrenheit") # 위 2과 같으나 컬럼명만 다름
convs<-c(conv.date2,conv.f2c) # 2개의 합수를 하나의 벡터로 만듦
df<-sameform(df,names)
for(conv in convs) df<-conv(df) # 2개 함수를 모두 적용?
return(df)
}
################### Step 3. smarter way #####################
#### 중복 들어내기 #4: cleanse 함수를 하나로 통합 하기 ####
##############################################################
cleanse<-function(df,names,convs){ # (df, 선택할 컬럼명, 적용할 conv들)
df<-sameform(df,names)
for(conv in convs)df<-conv(df)
return(df)
}
# cleanse함수에 인자만 다르게 주면 된다!!
clean1<-cleanse(raw1,c("date","temp"),c(conv.date1))
clean2<-cleanse(raw2,c("dt","temperature"),c(conv.date1))
clean3<-cleanse(raw3,c("month.and.date","fahrenheit"),c(conv.date2,conv.f2c))
#### 조금만 더?
cleanse<-function(file,names,convs){
df<-read.csv(file)
df<-sameform(df,names)
for(conv in convs)df<-conv(df)
return(df)
}
################## Step 4. 최종 결과물 #####################
#### 중복 들어내기 #4: cleanse 함수를 하나로 통합 하기 ####
##############################################################
#### 1. 변화 함수 만들기 ####
sameform<-function(df,colnames){
df<-subset(df,select=colnames)
colnames(df)<-c("date","temp")
return(df)
}
conv.f2c<-function(df){
return(transform(df,temp=((temp-32)/1.8)))
}
conv.date1<-function(df){
return(transform(df,date=as.integer(substr(date,7,9))))
}
conv.date2<-function(df){
return(transform(df,date=as.integer(substr(date,5,7))))
}
#### 2. cleanse 함수 만들기 ####
cleanse<-function(file,names,convs){
df<-read.csv(file)
df<-sameform(df,names)
for(conv in convs)df<-conv(df)
return(df)
}
#### 2. cleanse 함수 호출 하기 ####
clean1<-cleanse("temp01.csv",c("date","temp"),c(conv.date1))
clean2<-cleanse("temp02.csv",c("dt","temperature"),c(conv.date1))
clean3<-cleanse("temp03.csv",c("month.and.date","fahrenheit"),c(conv.date2,
conv.f2c))
#### 3. 결과를 결합하기 ####
result<-rbind(clean1,clean2,clean3)
'Fast Camp_DA' 카테고리의 다른 글
Fast Campus: Data Analytics 21일차 (5/10) (0) | 2015.05.10 |
---|---|
Fast Campus: Data Analytics 19일차 (4/29) (0) | 2015.04.29 |
Fast Campus: Data Analytics 18일차 (4/26) (0) | 2015.04.26 |
Fast Campus: Data Analytics 17일차 (4/22) Part 1 (0) | 2015.04.22 |
Fast Campus: Data Analytics 16일차 (4/19) Part 2 (0) | 2015.04.19 |