Language/R

[R] 데이터 전처리: left_join, bind_rows 함수

Jonnie 2021. 10. 15. 11:08

left_join 함수

  • 기존 데이터 프레임에 새로운 데이터 프레임을 합칠 때 사용
  • 두 데이터프레임에서 공통의 변수가 존재해야 함
  • relocate 함수: 열의 위치를 바꿀 때 사용하는 함수
    • (이동시킬변수명, 이동할 위치 = 변수명)
      • 이동할 위치: .before / .after 두 가지 가능
      • 변수명: 이동할 위치의 기준점

18-1. 연료별 가격 데이터 프레임(fuel_price) 만들기

fuel_price <- data.frame(fuel=c("CNG","diesel","ethanol","premium","regular"),fuel_price = c(2.35,2.38,2.11,2.76,2.22))

18-2. 공통변수인 fuel을 기준으로 mpg와 fuel_price 합치기

mpg <- left_join(mpg, fuel_price, by="fuel")

19-1. 구동방식별 가격 데이터 프레임(drv_price) 만들기

drv_price <- data.frame(driving=c(4,"forward","rear"), drv_price = c(40000, 30000, 50000))

19-2. mpg와 drv_price 합치기

  • 공통변수가 없는 상황에서 어떻게 합칠 수 있을까?
  • 기본 파라미터: by = c("변수1"="변수2")
mpg <- left_join(mpg, drv_price, by=c("drv"="driving"))

20. fuel_price는 fuel 뒤로, drv_price는 city 앞으로 이동시키기

  • 하나의 명령문으로 작성하기는 어렵고, 변수 별로 나누어서 실행
mpg <- mpg %>% relocate(fuel_price, .after=fuel)
mpg <- mpg %>% relocate(drv_price, .before = city)

bind_rows 함수

  • 새로운 사례를 추가할 때 사용하는 함수
  • 새로운 사례는 기존 데이터 프레임에 속하는 변수로 측정된 사례여야 함
  • 중복된 값(기준치)에 대해 하나를 제외하는 방법: distinct
    •  
    • exam <- exam %>% distinct(id, total, .keep_all=T)
exam_add <- read.csv("exam_add.csv", stringsAsFactors = F, fileEncoding = "CP949", encoding = "UTF-8")

 

→ encoding으로 인한 에러가 발생해(macOS) fileEncoding, encoding 값을 추가하여 해결

 

exam_add$class <- as.factor(exam_add$class)
exam <- bind_rows(exam, exam_add)

→ exam의 class는 범주형이고 exam_add의 class는 int형이어서 bind가 되지 않음. 첫 번째 줄 코드를 통해 class 자료형을 맞추어주는 것으로 해결


21. 통합된 exam 데이터 프레임에서 id=34는 id만 다를 뿐, id=29와 동일한 사례이므로 제거하시오.

exam <- exam %>% distinct(class, address, total, .keep_all = T)

22. average 변수 측정결과가 NA인 사례에 대해 세 과목에 대한 실제 평균값을 구해서 이 값으로 대체하시오.

exam$average <- ifelse(is.na(exam$average), exam$total/3, exam$average)
#소수점 둘째 자리까지만 표현
exam$average <- round(exam$average, digits=2)

23. science 변수 측정결과가 NA인 사례에 대해 다른 사례들의 science 평균값으로 대체하시오.

exam$Science <- ifelse(is.na(exam$Science), mean(exam$Science, na.rm = T), exam$Science)