본문 바로가기

Study/class note

R / 함수생성, if문과 loop문

38  R에서 if문과 loop문 사용하는 방법

함수 생성 방법

2. if문 사용 방법

3. loop문 사용 방법

 

- 함수 생성방법

#문법
함수명 <- function(입력매개변수명){   실행문 
                                    return  (실행결과를 담은 변수명)
                                 }

예제. 이름을 입력하면 해당 사원의 월급이 출력되는 함수를 생성하시오(R로 생성)

# R
emp <- read.csv("c:\\data\\emp2.csv")
income <- function(name){ 
                          sal <- emp[emp$ename == name, c("sal")]
                          return (sal) 
                        }
income('SCOTT')

문제215. 위의 코드를 파이썬으로 구현해서 함수를 아래와 같이 실행하시오

income('SCOTT')

3000

# python
def income(name):
    result = emp[['sal']][emp['ename'] == name]
    return result

income('SCOTT')

예제2.  예제 1번 R코드를 수정하는데 이름을 아래와 같이 소문자로 입력해도 출력되게 하시오

# R
emp <- read.csv("c:\\data\\emp2.csv")
income <- function(name){ 
                          sal <- emp[emp$ename == toupper(name), c("sal")]
                          return (sal) 
                        }
income('scott')

toupper() 함수를 name에 두르면 됨

 

문제216. 위의 코드를 파이썬으로 구현하시오.

# python
def income(name):
    result = emp[['sal']][emp['ename'] == name.upper()]
    return result

income('scott')

예제3. 직업을 입력하면 해당 직업의 토탈월급이 출력되게 하는 함수를 생성하시오.

# R
sum_job <- function(job){ sal <- sum(emp[ emp$job == toupper(job), c("sal")])
                                     return (sal)}
sum_job('salesman')

문제217. 위의 함수를 파이썬으로 생성하시오

# python
def sum_job(job):
    result = emp[['sal']][emp['job'] == job.upper()].sum()
    return result

sum_job('salesman')

예제4. 위의 스크립트에 paste 함수를 이용해서 아래와 같이 출력되게 하시오.

sum_job('salesman')

salesman의 토탈월급은 5600입니다.

# R
sum_job <- function(job){ sal <- sum(emp[ emp$job==toupper(job), c("sal")])
                          return ( paste(job,'의 토탈월급은 ',sal,'입니다') )}
sum_job('salesman')

문제218. 위의 함수를 파이썬으로 생성하시오.

# python
def sum_job(job):
    result = emp[['sal']][emp['job'] == job.upper()].sum()
    return job+'의 토탈월급은 '+str(result[0])+'입니다.'

sum_job('salesman')

예제5. 직업을 물어보게 하고 직업을 입력하면 해당 직업의 토탈월급이 출력되게 하시오.

# R
sum_job <- function(){ job <- readline(prompt = '직업을 입력하세요~ ') 
                       sal <- sum(emp[ emp$job==toupper(job), c("sal")])
                      return ( paste(job,'의 토탈월급은 ',sal,'입니다') )}
sum_job()

문제219. 위의 함수를 파이썬으로 구현하시오.

# python
def sum_job():
    job = input('직업을 입력하세요~  ')
    result = emp[['sal']][emp['job'] == job.upper()].sum()
    return job+'의 토탈월급은 '+str(result[0])+' 입니다.'

sum_job()

 

- if문 사용 방법

# 문법
if(조건식){    조건식이 TRUE일 때 실행하는 실행문      }
else if(조건식){    조건식이 TURE일 때 실행하는 실행문     }
else{   위의 조건식들에 만족하지 않는 경우 실행되는 실행문     }

예제1. if문을 이용해서 피타고라스의 직각삼각형 여부를 구현하시오.

triangle()  

밑변을 입력하세요~  3

높이를 입력하세요~  4

빗변을 입력하세요~  5

직각삼각형이 맞습니다. 

or 직각삼각형이 아닙니다.

# R
triangle <- function() { 
                         a <- as.integer(readline(prompt = '밑변을 입력하세요~ '))
                         b <- as.integer(readline(prompt = '높이를 입력하세요~ '))
                         c <- as.integer(readline(prompt = '빗변을 입력하세요~ '))
                         if (a^2 + b^2 == c^2 ){print ('직각삼각형이 맞습니다.')}
                         else {print('직각삼각형이 아닙니다.')} 
                         }
triangle()

문제220. 이름을 물어보게 하고 이름을 입력하면 해당 사원이 고소득자인지 중간소득자인지 저소득자인지 출력되게 하시오.

월급 >= 3000 고소득자

월급 >= 2000 중간소득자

저소득자

# R
find_name <- function() {
                          name <- readline(prompt = '이름을 입력하세요~ ')
                          sal <- emp[emp$ename == toupper(name), "sal"]
                          if(sal >= 3000){print('고소득자 입니다.')}
                          else if(sal >= 2000){print('중간소득자 입니다.')}
                          else{print('저소득자 입니다.')}
                        }
find_name()

 

- loop문 사용방법

# 문법
for (루프변수 in 반복할 리스트) {반복할 실행문}

예제. 1부터 10까지 출력하기

# R
for ( i in 1:10 ) {print (i) }

예제2. 아래의 파이썬 코드를 R코드로 구현하시오.

# python
import csv
file = open("c:\\data\\emp5.csv","r")
emp_csv = csv.reader(file)

sal = []
for i in emp_csv:
    sal.append(i[5])

print(sal)
# R
emp <- read.csv("c:\\data\\emp3.csv")

sal <- c()
for (i in 1:length(emp$sal) ) {
                                sal[i] <- emp$sal[i]
                               }
print(sal)

for문의 범위값을 넣을 때 for (i in 1:nrow(emp) ) nrow로 넣어도 가능함. 어차피 행의 갯수만큼 돌리는 거라서.

 

예제3. 아래의 파이썬 코드를 R코드로 구현하시오.

# python
import csv
file = open("c:\\data\\emp5.csv","r")
emp_csv = csv.reader(file)

sal = []
for i in emp_csv:
    if i[2] == 'SALESMAN':
        sal.append(i[5])

print(sal)
# R
sal <- c()
cnt <- 1
for (i in 1:nrow(emp) ) {
                         if(emp$job[i] =='SALESMAN'){ sal[cnt] <- emp$sal[i]
                         cnt <- cnt+1}
                         }
print(sal)

cnt <- 위치 인덱스의 값을 변화시켜서 null값이 sal 변수에 추가되지 않게 함.

# R
sal <- c()
for (i in 1:length(emp$sal)){
  if(emp$job[i] == 'SALESMAN'){
    sal = c(sal, emp$sal[i])
                              }
                            }
print(sal)

sal이라는 벡터에 c(컴바인)을 하는 방식으로 넣음.

 

 

문제221. (오늘의 마지막 문제) source('my_func.R')로 실행했을 때 나오는 자동화 코드 3번에 아래의 카이제곱 검정하는 R코드를 추가하시오.

#커미션을 받는 유무가 직업과 연관이 있는지 검정하는 코드
emp <- read.csv("c:\\data\\emp2.csv")
emp$comm_accept <- ifelse(is.na(emp$comm), 0, 1)
emp$cnt <- 1

result <- xtabs(cnt ~ comm_accept + job, emp)

chisq.test(result)'
text1 <- 'mycol0 <- rgb(1,0,0,seq(1,0,length=7)) \
car<- read.csv("c:\\data\\usedcars.csv")\
m<-sort(car$mileage)\

hist(m,col=mycol0,xlab="mileage",ylab="cnt",main="주행거리에 따른 중고차 분포")\
par(new=T)\
plot(m,dnorm(m,mean=mean(m),sd=sd(m)),type="l",axes=FALSE,ann=FALSE, col="red",\
     lwd=1.2)'

text2 <- 'car <- read.csv("c:\\data\\usedcars.csv")\
plot(car$mileage, car$price, pch = 21, col = "red", bg = "red")\
cor(car$mileage, car$price)'

text3 <- 'emp <- read.csv("c:\\data\\emp2.csv")\
emp$comm_accept <- ifelse(is.na(emp$comm), 0, 1)\
emp$cnt <- 1\

result <- xtabs(cnt ~ comm_accept + job, emp)\

chisq.test(result)'


my_func <- function() {
  
  x1 <- menu( c('정규분포 그래프','산포도 그래프','카이제곱 검정하기') ,
              title='숫자를 선택하세요 ~' )  
  
  switch ( x1,  
           san1 = {  cat(text1)  } ,
           san2 = {  cat(text2)  },
           san3 = {  cat(text3)  }
           
  )
  
}
my_func()
반응형