'조건 연산 프로그래밍'에 해당되는 글 1건

  1. 2015.09.05 R 조건 연산 프로그래밍 (conditional process programming) : if(), elseif() (6)

 

 

R에서 특정 조건을 만족하는지의 조건을 주고 뒤에 이어지는 표현식을 반복적으로 수행하게 하는 조건 연산 프로그래밍에 대해 알아보겠습니다.

 

 

 

먼저 한개의 숫자형 값에 대해 이것이 짝수인지 홀수인지 판단하는 R program을 짜보도록 하겠습니다.

 

 

 

 


  • 하나의 값에 대한 판단인 경우 : 

    if( 조건1 ) {
              표현식 1
    } else if (조건2) {
              표현식 2
    } else {
              표현식 3
    }

  

[ 짝수, 홀수 여부 판단 프로세스 ]

 

 

(1) 하나의 논리값에 대한 판단인 경우 : if()

 

> ## 하나의 논리값에 대한 판단
> # if()
> x1 <- c(4)
> if (x1 %% 2 == 0) {
+   y1 = c("Even Number")
+   print(y1)
+ } else {
+     y1 = c("Odd Number")
+     print(y1)
+ }
[1] "Even Number"

 

 

> x2 <- c(5)
> if (x2 %% 2 == 0) {
+   y2 = "Even Number"
+   print(y2)
+ } else {
+   y2 = "Odd Number"
+   print(y2)
+ }
[1] "Odd Number"
 

위의 2개의 예에서는 x1 이 4일 때 "Even Number"라고 판단했고, x2가 5일 때 "Odd Number"라고 잘 판단하였습니다.

 

하지만, 아래의 예제처럼 두개 이상의 논리값 벡터를 사용하는 경우에는 오류가 발생하게 되며, 아래 예제에서 보면 1~5까지 숫자 중에서 제일 처음으로 나오는 1에만 아래의 조건연산 프로그램이 적용되었고 두번째부터는 적용이 안되었습니다.  이럴 때는 ifelse() 문을 사용하여야 합니다

 

> # Error
> x3 <- c(1, 2, 3, 4, 5)
> if (x3 %% 2 == 0) {
+   y3 = "Even Number"
+   print(y3)
+ } else {
+   y3 = "Odd Number"
+   print(y3)
+ }
[1] "Odd Number"
Warning message:
In if (x3%%2 == 0) { :
  the condition has length > 1 and only the first element will be used

 



 

(2) 두개 이상의 논리값 벡터에 대한 판단 : ifelse()

 

  • 두개 이상의 논리값 벡터에 대한 판단인 경우 :

    ifelse( 조건1, 표현식1, 
          ifelse( 조건2, 표현식2, 
                 ifelse( 조건3, 표현식3, 표현식4)
                 ) 
           )
  •  

    위와 동일하게 1~5의 숫자에 대해서 이번에는 ifelse() 문을 사용해서 짝수, 홀수 여부를 판단하게 하고, 이를 데이터프레임 구조로 변환해서 view해보겠습니다.

     

    > ## vector 에 대한 판단
    > # 홀수/짝수 여부 판단 : ifelse( condition, expression 1, expression 2 )
    > x <- c(1, 2, 3, 4, 5)
    > z <- ifelse(x%%2 == 0, "Even Number", "Odd Number")
    > xz <- data.frame(x, z)
    > xz
      x           z
    1 1  Odd Number
    2 2 Even Number
    3 3  Odd Number
    4 4 Even Number
    5 5  Odd Number

     

     

     


     

     

    이번에는 양수, 0, 음수 인지 여부를 판단한 후 원래 벡터와 판단하는 프로그램을 ifelse()를 사용하여 짜보도록 하겠습니다.

     

    [ 양수, 0, 음수 인지 여부 판단하는 프로세스 ]

     

     

    > # 양수, 0, 음수인지 여부 판단 : ifelse( condition, expression 1, expression 2 ) > x <- c(-2, -1, 0, 1, 2) > y <- ifelse( x > 0, "Positive", + ifelse( x == 0, "Zero", "Negative") + ) > > xy <- data.frame(x, y) > > xy x y 1 -2 Negative 2 -1 Negative 3 0 Zero 4 1 Positive 5 2 Positive 

     

     


     

    To 산낙지님,

    제가 가족 여행다녀오느라 이제서야 집에 와서 댓글 달려고 막 하는 와중에...댓글을 삭제하셨네요. ^^;

    3가지 조건을 주어서 1, 0 혹은 yes, no 범주형 dummy 변수를 생성하는 방법은 아래를 참고하세요.

    MASS 패키지의 Cars93데이터프레임을 가지고 예를 들었습니다.

    [예제] "차종(Type)이 "Campact" 이고 & 가격(Price)이 16이하이고 & 고속도로연비(MPG.highway)가 30이상이면 1, 그 외는 모두 0인 변수 sub_yn 을 만드시오"

    ## Making dummy variable using ifelse() and transform()
    library(MASS)
    str(Cars93)
    summary(Cars93$Price)
    summary(Cars93$MPG.highway)

    Cars93 <- transform(Cars93,
                               sub_yn = ifelse(Type == c("Compact")
                                                   & Price <= 16
                                                   & MPG.highway >= 30, 1, 0))

     

     

     

     

    이번 포스팅이 도움이 되었다면 아래의 '공감 ~♡' 단추를 꾸욱 눌러주세요.^^

     

     

    Posted by R Friend R_Friend

    댓글을 달아 주세요

    1. R Friend R_Friend 2016.10.03 19:03 신고  댓글주소  수정/삭제  댓글쓰기

      To 산낙지님,

      제가 가족 여행다녀오느라 이제서야 집에 와서 댓글 달려고 막 하는 와중에...댓글을 삭제하셨네요. ^^;

      3가지 조건을 주어서 1, 0 혹은 yes, no 범주형 dummy 변수를 생성하는 방법은 아래를 참고하세요.

      MASS 패키지의 Cars93데이터프레임을 가지고 예를 들었습니다.

      [예제] "차종(Type)이 "Campact" 이고 & 가격(Price)이 16이하이고 & 고속도로연비(MPG.highway)가 30이상이면 1, 그 외는 모두 0인 변수 sub_yn 을 만드시오"

      ## Making dummy variable using ifelse() and transform()
      library(MASS)
      str(Cars93)
      summary(Cars93$Price)
      summary(Cars93$MPG.highway)

      Cars93 <- transform(Cars93,
      sub_yn = ifelse(Type == c("Compact")
      & Price <= 16
      & MPG.highway >= 30, 1, 0))

      • 산낙지 2016.10.03 20:24  댓글주소  수정/삭제

        아 제가 방명록에 다시 달려고 댓글을 삭제했는데 여기에 달으셨군요 ^^; 댓글 삭제해서 죄송하고 답변 정말 감사합니다~~ 많은 참고 하겠습니다!

    2. 정현복 2017.01.06 17:56  댓글주소  수정/삭제  댓글쓰기

      a=c(1,2,NA,NA,3,5)
      b=c(2,4,5,6,7,8)
      ab=cbind(a,b)
      ab=as.data.frame(ab)
      class(ab)

      if (is.na(ab$a)=TRUE) ab$a=0 else ab$a=1
      if (is.na(ab$a)) ab$a=0 else ab$a=1
      if(ab$a==NA) {ab$a=0} else {ab$a=1}
      ab$a=ifelse(is.na(ab$a),0,1)

      안녕하세요 제가 코딩을 해보가 if문을 사용하는데 아무리 고쳐보고 책찾아보고 해도 도대체 왜 않되는지 모르겠습니다 맨마지막 코딩은 비로서 실행이 되는데 저거는 실행이 된다면 그러면 위에 if문들은 왜 않되는건지 도저히 이해가 않됩니다 도와주세요 ㅠㅠ

    3. 정현복 2017.01.09 23:54  댓글주소  수정/삭제  댓글쓰기

      글쓴이분 정말감사해요
      근데 1가지 정말 해결해주실수 잇나요
      데이터 테이블인데 지금
      gender변수안에 m f 가 팩터로 들어가 있는데 저는 그 변수값을 m이면 1 f면 0으로 넣고싶은데 어떻게 해야 할까요 이것도 찾아보고 저것도 찾아보고 3시간넘게 사투중인데 공모전 준비하는데 ㅠㅠ
      너무 힘들어요 아진짜 ㅠㅠㅠ제발 도와주세요 ㅠㅠ

      • R Friend R_Friend 2017.01.10 00:33 신고  댓글주소  수정/삭제

        정현복님, transform()과 elif() 함수가지고 간단한 예제 R script 짜보았습니다. 참고하세요.

        # making an example dataframe
        cust_id <- c(1, 2, 3, 4, 5, 6)
        gender <- c("F", "M", "F", "F", "M", "F")
        age <- c(23, 28, 42, 34, 45, 36)

        cust_df <- data.frame(cust_id, gender, age)

        # data structure check
        str(cust_df)

        # transforming by ifelse() function
        cust_df <- transform(cust_df, gender_new = ifelse(gender == "M", 1, 0))

        cust_df

        # 참고 포스팅
        http://rfriend.tistory.com/38