R 파생변수 생성 - R pasaengbyeonsu saengseong

파생변수

변수들을 조합하거나 함수를 적용해 새로 만든 변수

변수 조합으로 파생 변수 생성

  • a$새로만들변수 <- a$조합할변수1 + a$조합할변수2 형태로 씀
  • 예시
choi$mean <- (choi$math + choi$english) / 2

조건문 이용해 파생 변수 생성

ifelse(조건, "조건에맞을때", "조건에맞지않을때") 형태로 사용

choi$grade <- ifelse(choi$math >= 70, "pass", "non-pass")

히스토그램 생성

hist(변수) 로 생성

빈도표

table(변수)로 확인 가능

막대그래프로 빈도 표현

qplot(변수)로 표현

  • ggplot2 패키지 활용하므로 install & load 필수

중첩조건문

변수 <- ifelse(조건, "만족할경우", ifelse(2번째조건, "만족O", "만족X"))

형태로 사용, 예시 ▽

mpg$grade <- ifelse(mpg$total >= 30, "A", ifelse(mpg$total >= 20, "B", "C"))

데이터 분석 시 주어진 원데이터를 그대로 활용하기 보다는 분석의 목표에 적합하게 계속해서 데이터 형태를 수정보완 해주어야 합니다. 오늘은 원데이터의 변수를 기준으로 파생변수를 추가하는 방법에 대해 정리해보겠습니다. :-)

사용할 예제 데이터는 R에 기본으로 내장되어 있는 women입니다. 파생변수를 만들기에 앞서 women데이터의 요약을 확인해봅시다. (> 요약함수 포스팅 바로 가기)

> dplyr::glimpse(women) Observations: 15 Variables: 2 $ height <dbl> 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72 $ weight <dbl> 115, 117, 120, 123, 126, 129, 132, 135, 139, 142, 146, 150, 154, 159,> summary(women) height weight Min. :58.0 Min. :115.0 1st Qu.:61.5 1st Qu.:124.5 Median :65.0 Median :135.0 Mean :65.0 Mean :136.7 3rd Qu.:68.5 3rd Qu.:148.0 Max. :72.0 Max. :164.0

이 데이터는 height와 weight의 두 수치형 변수로 구성되어 있군요! 여기서 summary의 min과 max를 보면 두 변수 모두 둘다 우리나라에서 쓰이는 cm와 kg 기준은 아닌 것을 알 수 있습니다. R의 help를 참고하면 height는 인치 weiht는 파운드 기준 이라고 하네요!

이렇게 파악한 데이터 내용을 참고하여 아래의 파생 변수들을 만들어 보도록 하겠습니다. 😀😊🤓

🍀 기존 변수 이름 변경
🍀 cm와 kg 기준의 새로운 height 및 weight 변수를 추가하고 이를 활용한 bmi 파생변수 생성
🍀 키를 두가지 기준으로 나눈 파생변수 추가
🍀 bmi 지수를 다섯가지 기준으로 나눈 파생변수 추가

가장 먼저, 본 포스팅은 dplyr 패키지를 활용할 것이기 때문에 tidyverse를 로드 해주셔야 합니다! > library(tidyverse)

  • 기존 변수 이름 변경
    • dplyr 패키지의 rename 함수를 활용합니다.
> women %>% # 데이터 지정 + dplyr::rename(height_in = height, # 수정할 변수명 = 기존 변수명 + weight_lb = weight) # 수정할 변수명 = 기존 변수명 height_in weight_lb 1 58 115 2 59 117 3 60 120 4 61 123 5 62 126 6 63 129 7 64 132 8 65 135 9 66 139 10 67 142 11 68 146 12 69 150 13 70 154 14 71 159 15 72 164
  • 기본 함수를 활용한 아래의 방식으로 저장해주어도 됩니다.
    이 방식을 사용하면원래 변수명을 입력하지 않아도 되는 장점이 있지만, 변수 순서가 헷갈려 잘못 입력할 수 있다는 점과 원 데이터가 바로 변경된다는 점에 있어서 rename을 추천드립니다.
> colnames(women) <- c("height_in", "weight_in")
  • height_cm, weight_kg, bmi의 세 파생변수 추가
    • dplyr 패키지의 mutate함수를 사용하겠습니다.
    • 더불어 추가한 변수의 소숫점이 0자리로 나오도록 round 함수를 통해 조정해주었습니다. > round(숫자, digits = 표시할 자릿수)
    • ⚡여기서 주의사항⚡
      bmi는, kg과 cm 기준의 변수들을 활용할 것이기 때문에, height_cm 변수와 weight_kg 변수를 먼저 추가하고 가장 마지막 줄에 추가해주어야 합니다!

      1 in = 2.54 cm
      1 lb = 0.453592 kg
      bmi = 체중(kg) ÷ {키(m) x 키(m)}

> women2 %>% # 위 기존 변수 이름 변경한 버전을 women2에 저장해주었어요. dplyr::mutate(height_cm = round(height_in * 2.54, digits = 0), weight_kg = round(weight_lb * 0.453592, digits = 0), bmi = round(weight_kg / {{height_cm*0.01} * {height_cm*0.01}}, digits = 0)) # 1. 세가지 변수 추가 : mutate(추가할 변수 명 = 변수 내용) # 2. 각 변수별 소수점 자릿수 지정 : mutate(추가할 변수 명 = round(변수 내용, digits = 표시할 자릿수) # 참고) bmi 계산에서 키는 m 기준이므로 cm기준의 변수에 *0.01 해줌 height_in weight_lb height_cm weight_kg bmi 1 58 115 147 52 24 2 59 117 150 53 24 3 60 120 152 54 23 4 61 123 155 56 23 5 62 126 157 57 23 6 63 129 160 59 23 7 64 132 163 60 23 8 65 135 165 61 22 9 66 139 168 63 22 10 67 142 170 64 22 11 68 146 173 66 22 12 69 150 175 68 22 13 70 154 178 70 22 14 71 159 180 72 22 15 72 164 183 74 22
  • 키를 두가지 기준으로 나눈 파생변수 추가
    • 파생변수를 추가한 버전의 요약을 살펴보니 height_cm변수의 평균값은 165.1 이네요.
    • 그럼 165.1 이라는 수치를 기준으로 평균이상과 평균 미만으로 데이터를 나눈 변수를 만들어보겠습니다.
    • 기준 분리는 ifelse 함수를 활용했습니다. > ifelse(test, yes, no)
> summary(women2) # 평균수치 살펴보기 height_in weight_lb height_cm weight_kg bmi Min. :58.0 Min. :115.0 Min. :147.0 Min. :52.00 Min. :22.0 1st Qu.:61.5 1st Qu.:124.5 1st Qu.:156.0 1st Qu.:56.50 1st Qu.:22.0 Median :65.0 Median :135.0 Median :165.0 Median :61.00 Median :22.0 Mean :65.0 Mean :136.7 Mean :165.1 Mean :61.93 Mean :22.6 3rd Qu.:68.5 3rd Qu.:148.0 3rd Qu.:174.0 3rd Qu.:67.00 3rd Qu.:23.0 Max. :72.0 Max. :164.0 Max. :183.0 Max. :74.00 Max. :24.0 > women2 %>% + dplyr::mutate(height_new = ifelse(height_cm >= 165.1, "평균이상", "평균미만")) height_in weight_lb height_cm weight_kg bmi height_new 1 58 115 147 52 24 평균미만 2 59 117 150 53 24 평균미만 3 60 120 152 54 23 평균미만 4 61 123 155 56 23 평균미만 5 62 126 157 57 23 평균미만 6 63 129 160 59 23 평균미만 7 64 132 163 60 23 평균미만 8 65 135 165 61 22 평균미만 9 66 139 168 63 22 평균이상 10 67 142 170 64 22 평균이상 11 68 146 173 66 22 평균이상 12 69 150 175 68 22 평균이상 13 70 154 178 70 22 평균이상 14 71 159 180 72 22 평균이상 15 72 164 183 74 22 평균이상
  • BMI를 다섯가지 기준으로 나눈 파생변수 추가
    • 지금 활용하는 women 데이터의 bmi 지수는 22~24 사이에 있어요. 그래서 파생변수를 만드는 의미는 없으나 공부를 위해 코드를 만들어 볼게요.
    • ifelse를 여러번 사용해도 되지만, 구간을 나눌 수 있는 cut 함수를 활용하였습니다.

    저체중 : BMI ~ 19.9
    정상 : BMI 20~24.9
    과체중(1도 비만) : BMI 25~29.9
    비만(2도 비만) : BMI 30~39.9
    고도비만 : BMI 40

> women2 %>% + dplyr::mutate(bmi_new = cut(x = bmi, # 기준 데이터 + breaks = c(0, 20, 25, 30, 40, 100), # 구간 : 0~20, 20~25, 25~30 ... 만약 특정 규칙이 있다면 a * 1:3 <= 이런 형태로도 가능 + right = FALSE, # '=' 를 왼쪽과 오른쪽 중 어디로 할지 : 0 <= bmi < 20을 원한다면 왼쪽에 '='가 있으므로 FALSE로 지정 + labels = c("저체중", "정상", "과체중", "비만", "고도비만"), # 각 구간별 이름 + ordered_result = TRUE)) # 순서형 factor로 만들어주고 싶다면 TRUE height_in weight_lb height_cm weight_kg bmi height_new bmi_new 1 58 115 147 52 24 평균미만 정상 2 59 117 150 53 24 평균미만 정상 3 60 120 152 54 23 평균미만 정상 4 61 123 155 56 23 평균미만 정상 5 62 126 157 57 23 평균미만 정상 6 63 129 160 59 23 평균미만 정상 7 64 132 163 60 23 평균미만 정상 8 65 135 165 61 22 평균미만 정상 9 66 139 168 63 22 평균이상 정상 10 67 142 170 64 22 평균이상 정상 11 68 146 173 66 22 평균이상 정상 12 69 150 175 68 22 평균이상 정상 13 70 154 178 70 22 평균이상 정상 14 71 159 180 72 22 평균이상 정상 15 72 164 183 74 22 평균이상 정상


🍎 위 모든 것을 한번에 코드로 써보기

> women2 <- women %>% + dplyr::rename(height_in = height, + weight_lb = weight) %>% + dplyr::mutate(height_cm = round(height_in * 2.54, digits = 0), + weight_kg = round(weight_lb * 0.453592, digits = 0), + bmi = round(weight_kg / {{height_cm*0.01} * {height_cm*0.01}}, digits = 0), + height_new = ifelse(height_cm >= 165.1, "평균이상", "평균미만"), + bmi_new = cut(x = bmi, + breaks = c(0, 20, 25, 30, 40, 100), + right = FALSE, + labels = c("저체중", "정상", "과체중", "비만", "고도비만"), + ordered_result = TRUE))

이상입니다.✨

Toplist

최신 우편물

태그