Stats & AI tech blog - '일단 시도함'

[R] 자주 쓰는 전처리 코드 정리 본문

Programming/R

[R] 자주 쓰는 전처리 코드 정리

justdoit ok? 2024. 2. 23. 16:16
  • 라이브러리 & 데이터 불러오기
# library
setwd("C:/Users/PC2/Documents/Rcode")
req <- substitute(require(x, character.only = TRUE))
lib = list('ggplot2','data.table','tidyverse','gridExtra','ggpubr',
           'viridis','maps','VGAM','vegan','forecast','xts','GGally','caret','textclean')
sapply(lib, function(x) eval(req) || {install.packages(x); eval(req)})

# data.table packages 대용량 데이터에서 성능 좋음
data <- fread("경로.csv")
#fread("./data/train.csv", header = T, sep = ",", encoding = "UTF-8")
# check import data
glimpse(data)

 

  • 변수명 변경
# 충돌 에러 (unused argument error) 발생할 경우 패키지 명시해주기
data %>% 
  dplyr::rename(Annaul_Income = 'Annual Income (k$)',
         Spending_Score = 'Spending Score (1-100)')

 

  • 변수 타입 변경
# 동시에 여러 컬럼 변경
data[,1:11] <- sapply(data[,1:11], as.character)

# 문자형 변수 factor형으로 변경
data %>%
	mutate_if(is.character, as.factor)

 

  • Factor 변수 처리 
# factor로 변경
# ordered=T는 데이터가 순서형임을 뜻함
data$quarter <- factor(data$quarter, ordered = T, levels =c('Q1', 'Q2', 'Q3', 'Q4'))

# factor level명 변경
data$StockCode <- fct_recode(data$StockCode, "Postage" = "POST", "Discount" = "D",
                                 "Carriage" = "C2")
                                 
# factor level 순서 변경
df <- df %>% 
  mutate(Time = factor(Time, ordered = T, levels=c("Day0","Day1","Day3","Day7","Day14","Day21"))) %>% 
  mutate_if(is.character, as.factor) %>%

 

  • 날짜 변수 처리 {lubridate}
# chr to posixct
data$InvoiceDate <- as.POSIXct(data$InvoiceDate, tryFormats = '%m/%d/%Y %H:%M')  

# posixct to Date (no time)
data$date <- as.Date(data$InvoiceDate)

# extract year as chr
data$year <- format(data$date, '%Y')

# extract month as factor
data$month <- factor(format(data$date, '%b'), ordered=T,
                     levels = c('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',
                                'Oct', 'Nov', 'Dec'))
# extract quarter and weekend
data$quarter <- case_when(
  data$month %in% c('Jan', 'Feb', 'Mar') ~ 'Q1',
  data$month %in% c('Apr', 'May', 'Jun') ~ 'Q2',
  data$month %in% c('Jul', 'Aug', 'Sep') ~ 'Q3',
  data$month %in% c('Oct', 'Nov', 'Dec') ~ 'Q4',
  TRUE ~ 'Unknown'
)
commerce$quarter <- factor(commerce$quarter, ordered = T, levels =c('Q1', 'Q2', 'Q3', 'Q4'))
commerce$weekend <- ifelse(weekdays(commerce$date) %in% c('Saturday', 'Sunday'), 'weekend', 'weekday')

 

  • 중복값 & 결측치 확인
# 중복id 확인
n_distinct(CustomerID)

# 컬럼별 결측값 확인
sapply(data, function(x){sum(is.na(x))})

# time, group별 unique id 확인
df %>% 
  filter(!is.na(right_control)) %>% 
  group_by(Time, Group) %>% 
  summarise(count = n_distinct(No))

 

  • 새로운 컬럼 생성
# 컬럼 select, ifelse, mutate로 새로운 컬럼 생성
data %>% 
  select(-event_contents) %>% 
  mutate(event_Ability = ifelse(event == "Ability", 1, 0),
         event_SetControlGroup = ifelse(event == "SetControlGroup", 1, 0)) -> train 

# case_when, mutate로 새로운 컬럼 생성
data %>% 
  mutate(P0_species = case_when(P0_species == "T" ~ 1,
                                P0_species == "P" ~ 2,
                                P0_species == "Z" ~ 3),
         P1_species = case_when(P1_species == "T" ~ 1,
                                P1_species == "P" ~ 2,
                                P1_species == "Z" ~ 3)) -> tidy_train