본문 바로가기
  • "You can't manage what you can't measure" Peter Drucker
데이터 분석 (with Rstudio)

[Rstudio] 조건문 if else case_when

by Vitaminymc 2024. 3. 24.
반응형

[ R 조건문 🟢 ]

R 프로그래밍 언어에서 조건문을 사용하는 주요 방법은 if, if + else, ifelse, case_when이다.

[ 사용 예제 : 예능방송인 브랜드 순위 ]

top50 <- read.csv("entertainer_top50.csv", fileEncoding = 'cp949')

head(top50)
  rank_mar   name sex      job rank_feb rank_jan
1        1 유재석  남 코메디언        2        2
2        2 이효리  여     가수        1       NA
3        3 신동엽  남 코메디언        4        3
4        4 박명수  남 코메디언        8       10
5        5 탁재훈  남     가수        3        1
6        6 전현무  남     방송        7        4

전체 데이터는 아래 참조
출처 : 한국기업평판연구소 (http://www.rekorea.net/)
[브랜드평판] 예능방송인 브랜드 2024년 1~3월 빅데이터 분석결과 (3월 1~50위 기준) 가공 (성별, 직업 추가)

names(top50)
[1] "rank_mar" "name"     "sex"      "job"      "rank_feb" "rank_jan"

[ R 조건문 : if 🟩 ]

if 문은 가장 기본적인 형태의 조건문으로 조건이 참(True)인 경우에만 특정한 코드를 실행한다.

if (조건) {
  # 조건이 참일 때 실행할 코드
}
if (nrow(top50) >= 50) { print ("Top 50") }
[1] "Top 50"
if (nrow(top50) < 50) { print ("Not Top 50") }

아무것도 실행되지 않음

if (top50$sex == "남") { top50$sex_id == 1 }
Error in if (top50$sex == "남") { : the condition has length > 1

if 문은 여러 개가 나오면 사용 불가
 if 문은 단일 값 또는 벡터에 대한 조건을 검사하는 데 사용된다.
데이터프레임(data.frame)에 if 문을 사용하면, 상기 Error가 뜬다.
Error ... the condition has length > 1
이러한 경우, 대체로 ifelse() 함수를 사용하거나, for 루프문을 사용하여 각 행에 대해 조건을 평가하고 원하는 작업을 수행하게 해야 한다.

[ 상기 예제 for  문 사용 예시  ]

 ifelse 등 다른 함수가 있으므로 상기 예제에 사용할 필요는 없음 (권장하지는 않음)

top50$sex_id = 0 #임시 값 저장, Error 방지

for (i in 1:nrow(top50)) {
  if (top50$sex[i] == "남") {
    top50$sex_id[i] = 1
  } 
}

head (top50)
  rank_mar   name sex      job rank_feb rank_jan sex_id
1        1 유재석  남 코메디언        2        2      1
2        2 이효리  여     가수        1       NA      0
3        3 신동엽  남 코메디언        4        3      1
4        4 박명수  남 코메디언        8       10      1
5        5 탁재훈  남     가수        3        1      1
6        6 전현무  남     방송        7        4      1

[ R 조건문 : if  + else 🟩 ]

if + else 문은 참(True)인 경우에는 if와 else 사이의 특정한 값 또는 코드를 실행하고, 거짓(False)인 경우는 else 이후의 특정한 값 또는 코드를 실행한다.

if (조건) {참일 때 반환할 값} else {거짓일 때 반환할 값}
if (nrow(top50) >= 50) { print ("Top 50") } else { print ("Not Top 50") }
[1] "Top 50"
library(tidyverse)

top50_2 <- top50 %>% filter (sex == "여")

if (nrow(top50_2) == 50) { print ("Top 50") } else { print (nrow(top50_2)) }
[1] 15

if + else 문도 여러 개가 나오면 사용 불가
Error ... the condition has length > 1
for 루프 문 사용

if(top50$sex == "남") { top50$sex_id = 1 } 
else { top50$sex_id = 2 }
Error in if (top50$sex == "남") { : the condition has length > 1
for (i in 1:nrow(top50)) {
if(top50$sex[i] == "남") { top50$sex_id[i] = 1 } 
                   else { top50$sex_id[i] = 2 }
}
  rank_mar   name sex      job rank_feb rank_jan sex_id
1        1 유재석  남 코메디언        2        2      1
2        2 이효리  여     가수        1       NA      2
3        3 신동엽  남 코메디언        4        3      1
4        4 박명수  남 코메디언        8       10      1
5        5 탁재훈  남     가수        3        1      1
6        6 전현무  남     방송        7        4      1

[ R 조건문 : ifelse 🟩 ]

ifelse 함수는 조건에 따라 값을 반환한다. ifelse 함수는 조건이 참(True)이면 첫 번째 값, 거짓(False)이면 두 번째 값이 반환된다.

ifelse(조건, 참일 때 반환할 값, 거짓일 때 반환할 값)
top50$sex_id <- ifelse(top50$sex == "남", 1, 2)

head(top50)
  rank_mar   name sex      job rank_feb rank_jan sex_id
1        1 유재석  남 코메디언        2        2      1
2        2 이효리  여     가수        1       NA      2
3        3 신동엽  남 코메디언        4        3      1
4        4 박명수  남 코메디언        8       10      1
5        5 탁재훈  남     가수        3        1      1
6        6 전현무  남     방송        7        4      1

for 문을 사용하지 않아도, 각 열의 성별에 따라, '1'과 '2'를 반환함

[ ifelse 속의 ifelse 중복 사용 예시  ]

unique(top50$job)
[1] "코메디언" "가수"     "방송"     "운동선수" "배우"     "모델"  
#job이 코메디언이면 job2는 Comedian
#가수면 Singer, 운동선수면 Athlete, 나머지 (방송, 배우, 모델)은 Entertainer 
top50$job_2 <- ifelse(top50$job == "코메디언", "Comedian", 
                      ifelse(top50$job == "가수", "Singer",
                             ifelse(top50$job == "운동선수", "Athlete", "Entertainer"
                                    )
                             
                             ) 
                      )
                      
head (top50)
  rank_mar   name sex      job rank_feb rank_jan sex_id       job_2
1        1 유재석  남 코메디언        2        2      1    Comedian
2        2 이효리  여     가수        1       NA      2      Singer
3        3 신동엽  남 코메디언        4        3      1    Comedian
4        4 박명수  남 코메디언        8       10      1    Comedian
5        5 탁재훈  남     가수        3        1      1      Singer
6        6 전현무  남     방송        7        4      1 Entertainer

 
조건문이 복잡해지기 때문에 ifelse를 중복하여 사용하는 것은 지양 


[ R 조건문 : case_when 🟩 ]

case_when 함수는 여러 개의 조건을 평가하고 각각에 대해 다른 값을 반환한다.

case_when(
  조건1 ~ 값1,
  조건2 ~ 값2,
  조건3 ~ 값3,
  ...
  TRUE ~ 기본값
)
library(tidyverse)

top50$job_2 <-  case_when(
                 top50$job == "코메디언" ~ "Comedian",
                 top50$job == "가수" ~ "Singer",
                 top50$job == "운동선수" ~ "Athlete",
                 TRUE ~  "Entertainer"
                )
                
head(top50)
  rank_mar   name sex      job rank_feb rank_jan sex_id       job_2
1        1 유재석  남 코메디언        2        2      1    Comedian
2        2 이효리  여     가수        1       NA      2      Singer
3        3 신동엽  남 코메디언        4        3      1    Comedian
4        4 박명수  남 코메디언        8       10      1    Comedian
5        5 탁재훈  남     가수        3        1      1      Singer
6        6 전현무  남     방송        7        4      1 Entertainer

여러 개의 조건을 순서대로 평가하며, 처음으로 참이 되는 조건에 해당하는 값을 반환한다.
만약 모든 조건이 거짓이면 기본값이 반환됩니다.
 

코메디언, 가수, 운동선수에 해당하는 값을 반환하고, 나머지 (방송, 배우, 모델)은 기본값 "Entertainer"를 반환한다.

top50 %>% filter (job_2 == "Entertainer")
  rank_mar   name sex  job rank_feb rank_jan sex_id       job_2
1        6 전현무  남 방송        7        4      1 Entertainer
2       20 송지효  여 배우       21       18      2 Entertainer
3       23 김성주  남 방송       20       17      1 Entertainer
4       26 차태현  남 배우       27       35      1 Entertainer
5       30 노홍철  남 방송       31       12      1 Entertainer
6       34 홍진경  여 모델       32       26      2 Entertainer
table(top50$job_2)
    Athlete    Comedian Entertainer      Singer 
          5          29           6          10 

[ 사용 예제 데이터 :  예능방송인 브랜드 순위 (entertainer_top50) ]

 [브랜드평판] 예능방송인 브랜드 2024년 1~3월 빅데이터 분석결과 가공

  • rank_mar : 3월 순위
  • name : 예능방송인 이름
  • sex : 예능방송인 성별 (추가) 
  • job : 예능방송인 메인 또는 이전 직업 (추가) 
  • rank_feb : 2월 순위
  • rank_jan : 1월 순위

각 월의 50위까지만 공개됨에 따라, 3월 Top 50 예능방송인의 1월과 2월은 순위가 없을 수 있음

rank_mar name sex job rank_feb rank_jan
1 유재석 코메디언 2 2
2 이효리 가수 1  
3 신동엽 코메디언 4 3
4 박명수 코메디언 8 10
5 탁재훈 가수 3 1
6 전현무 방송 7 4
7 김종국 가수 6 5
8 조세호 코메디언 5 14
9 이경규 코메디언 13 11
10 안정환 운동선수 11 15
11 서장훈 운동선수 10 16
12 김종민 가수 14 8
13 박나래 코메디언 12 7
14 김준호 코메디언 15 24
15 김숙 코메디언 9 32
16 이수근 코메디언 26 22
17 김구라 코메디언 16 19
18 이상민 가수 34 9
19 강호동 운동선수 23 6
20 송지효 배우 21 18
21 이지혜 가수 22 37
22 이동국 운동선수    
23 김성주 방송 20 17
24 하하 가수 17 13
25 김희철 가수 18 27
26 차태현 배우 27 35
27 정형돈 코메디언   23
28 김민경 코메디언   28
29 장도연 코메디언 19 31
30 노홍철 방송 31 12
31 윤종신 가수 24 33
32 홍현희 코메디언 30 36
33 이영자 코메디언   20
34 홍진경 모델 32 26
35 김신영 코메디언 29 25
36 데프콘 가수 36 42
37 김대희 코메디언 47 45
38 양세형 코메디언 25 29
39 유세윤 코메디언 46  
40 박미선 코메디언 41 40
41 송은이 코메디언 37  
42 김동현 운동선수 39  
43 양세찬 코메디언 33 21
44 김국진 코메디언 35 41
45 이국주 코메디언 44 44
46 정준하 코메디언   43
47 김영철 코메디언 45 48
48 지석진 코메디언   39
49 신봉선 코메디언 49  
50 김용만 코메디언 38 49

 


728x90