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)

Posted by Name_null