study blog

제어문 - 조건문(if, ifelse) & 반복문(for, while) / 사용자 정의 함수 본문

R/1. R 기초

제어문 - 조건문(if, ifelse) & 반복문(for, while) / 사용자 정의 함수

ivo_lee 2020. 1. 10. 08:54

1. 제어문

1-1. 조건문(if, ifelse)

① if구문

var1 = 100

var2 = 20

# 조건에 따라서 실행되는 code block을 제어할 수 있음

if(var1>var2){
  cat("참")  
} else if(var1==var2){
  cat(" ")
} else {
  cat("거짓")  
}

 

② ifelse: JAVA의 3항 연산자

ifelse(var1>var2,"참","거짓")

1-2. 반복문(for, while)

① for: 반복 횟수만큼 반복 실행 – 정해진 수

for(var1 in 1:5){
  print(var1)
}

 

② while: 조건이 참일 동안 반복 실행  -조건 주어질 때

 

idx = 1; mySum = 0
while (idx <10){
  mySum = mySum+idx
  idx=idx+1
}   #한 라인이  statement로 인식됨. ;사용하면 여러 statement 실행 가능

mySum   #sum(1:9)

 

ex) 로직(제어문을 이용해서) 1부터 100 사이에 있는 3의 배수를 출력하시오.

for(var1 in 1:100){
  if(var1%%3==0){
    print(var1)
  }
}

 

ex) 1부터 100 사이에 있는 prime number (소수)를 출력하시오.

myPrime = function(n){
  sol =c();
  for(var1 in 2:n){
    result = 0;
    for(i in 1:var1){
      if(var1 %% i ==0) {
        result <- result+1
      }
      i = i+1
    }
    if(result==2){
      sol <- c(sol,var1)
    }
  }
  return(sol)
}

2. 사용자 정의 함수 (User Define Function)

제공된 함수 외에 함수를 만들어 사용할 수 있음
함수명 <- function(x){ } 형태

 

ex) 입력받은 숫자를 제곱해서 돌려주는 함수를 하나 만들어 보자.

myFunc = function(x){            #function(x,y,z): 입력 인자의 개수 조절 가능
  x = x*x
  return(x)
}

myFunc(2)

 

ex) sum함수와 동일한 역할을 하는 mySum 함수 만들어보자- vector를 입력으로 받아서 합을 구해주는 함수

mySum = function(x){
  result = 0
  for(t in x){
    result = result+t
  }
  return(result)
}

var1 = 1:10
mySum(var1)

[연습문제]

1. 

사용할 데이터: 2 3 5 6 7 10

[연습문제 1] 주어진 데이터로 vector x를 생성하시오.

x <- c(2,3,5,6,7,10)

[연습문제 2] 주어진 데이터 각각을 제곱해서 vector x를 생성해라.

x <- c(2,3,5,6,7,10)^2

[연습문제 3] 주어진 데이터 각각을 제곱해서 합을 구해라.

sum(c(2,3,5,6,7,10)^2)

[연습문제 4] 5보다 큰 값들로 구성된 vector x를 구하시오.

var1 <- c(2,3,5,6,7,10)
x <- var1[var1>5]        

var1 <- c(2,3,5,6,7,10)
var2 <- c(2,3,5,6,7,10)>5  # mask
x2 <- var1[var2]      

[연습문제 5] vector x의 길이를 구하시오.

x = c(2,3,5,6,7,10)
length(x)

[연습문제 6] R의 package 중에 Usingr 패키지의 데이터 이용

install.packages("UsingR")
library(UsingR)
# 데이터 불러들이기 -  1부터 2003까지의 숫자 중 prime number를 가지고 있음
data("primes")
head(primes)  # 앞에서부터 데이터 6개만 출력해줌
tail(primes)  # 뒤에서 6개 출력 -> 데이터 확인용

[연습문제 7] 1부터 2003까지 숫자 중 prime number는 몇 개인가?

length(primes)  # 총 304개

[연습문제 8] 1부터 200까지의 숫자 중 prime number는 몇 개인가?

length(primes[primes<=200])
sum(primes<201)  #논리연산의 sum -> 개수!

[연습문제 9] 평균을 구해보자.

mean(primes)

[연습문제 10] 500이상 1000이하의 prime number만으로 구성된 vector p를 구하시오.

p <- primes[primes>=500&primes<=1000]

2.  다음과 같은 형태의 데이터를 이용하여 아래의 문제를 풀어보자.

1 5 9
2 6 10
3 7 11
4 8 12

[연습문제 11] 위의 데이터를 이용하여 matrix x를 구하시오.

x <- matrix(1:12,nrow=4)

[연습문제 12] 전치행렬 (transpose matrix)을 만들어보자.

t(x)

[연습문제 13] matrix x에 대해 첫번째 행만 추출해보자.

x[1,]

[연습문제 14] matrix x에 대해 6,7,10,11 뽑아보자.

x[2:3,-1]

[연습문제 15] matrix x에 대해 x의 두번째 열의 원소가 홀수인 행들만 뽑아서 matrix p를 생성하시오.

p = subset(x,x[,2]%%2!=0)
p = x[x[,2]%%2==1,]

3. 프로그래밍 - 비개발직군 시험문제

 

홀수개의 숫자로 구성된 숫자문자열이 입력으로 제공된다.
문자열의 개수는 7개 이상 11개 이하로 제한된다. (즉, 입력 문자열의 길이는 7,9,11개)
중앙 숫자를 기준으로 앞과 뒤의 숫자를 분리한 후 분리된 두 수를 거꾸로 뒤집어서 두 수의 차를 구하시오.

ex) 7648623 (7자)
 -> 8을 기준으로 764,623  가운데를 기준으로 나눔
 -> 467,326  각 숫자를 거꾸로 뒤집음
 -> 141 (467-326)
 
ex) 7648620 (7자)
 -> 8을 기준으로 764,620
 -> 467,026  각 숫자를 거꾸로 뒤집음
 -> 141 (467-26)

 

install.packages("stringr")
library(stringr)

##방법 1

input = "7648623"
myFun = function(input){

  num = str_length(input) #숫자 길이
  mid = (num+1)/2   #기준숫자 위치
  
  sub1 = str_sub(input,1,mid-1) #앞 문자열
  sub2 = str_sub(input,mid+1,num) #뒤 문자열

  if(str_sub(sub1[[1]],(mid-1),(mid-1))!=0 & str_sub(sub2,(mid-1),1)!=0){
    sub1 <- str_split(sub1,"")
    sub2 <- str_split(sub2,"")
    x = sub1[[1]][mid-1]; y = sub2[[1]][mid-1]
    
    for(i in seq((mid-2):1)){
      x = paste(x,sub1[[1]][i])
      y = paste(y,sub2[[1]][i])
      i=i-1
    }
  }else{  # 0인경우    
  }
}


## 방법 2

input = "7648623"
myFun = function(input){
  num = str_length(input) #숫자 길이
  mid = (num+1)/2   #기준숫자 위치
  sub1 = str_sub(input,1,mid-1) #앞 문자열
  sub2 = str_sub(input,mid+1,num) #뒤 문자열

  if(str_sub(sub1,(mid-1),(mid-1))==0) {   # 끝 문자가 0일 경우
    sub1 <- str_split(sub1,"")
    str_sub(sub1[[1]],(mid-1),(mid-1))=""
  }else if(str_sub(sub2,(mid-1),(mid-1))==0){
    sub2 <- str_split(sub2,"")
    str_sub(sub2,(mid-1),(mid-1))=""
  }

  sub1 <- str_split(sub1,"")
  sub2 <- str_split(sub2,"")
  x = sub1[[1]][mid-1]; y = sub2[[1]][mid-1]

  for(i in seq((mid-2):1)){
    x = paste(x,sub1[[1]][i],sep="")
    y = paste(y,sub2[[1]][i],sep="")
    i=i-1
  }

  x <- as.numeric(x)
  y <- as.numeric(y)
  result = abs(x-y)
  return(result) 

}
Comments