Data Journey

International Studies Grad. racing for AI Engineer

Download as .zip Download as .tar.gz View on GitHub
8 February 2021

R Programming

by mervyn

source “K-MOOC 오세종 교수님의 강좌의 6. R 프로그래밍 중 (http://www.kmooc.kr/courses/course-v1:DKUK+DKUK0003+2020_T3)"

Conditional if

if(logical expression){
   statements
} else {
   alternative statements
}
a<- 10
b<- 20
if(a>5 & b>5){ # and
  print(a+b)
} 
if(a>5 | b>30){ # or
  print(a*b)
}
else { # else
  print(a*10)
  print(a/10)
}
ifelse (a>b, c<-a, c<-b) # (condition, true, false)
c

for

for(i in 1:10){ # iterate 1 to 10. i++
  print(i) # print one value
  cat("2*", i, "=", 2*i, "\n") # cat(): when print a string of values at one time. 
}
for(i in 1:20){
  if(i%%2==0){
    print(i)
  }
}
v1<- 101:200
for(i in 1:length(v1)){
  if(v1[i]%%2==0){
     print(v1[i]*2){
     } else {
        print(v1[i]+2)
     }
}
sum<-0
for(i in 1:100){
   sum<- sum+i
}
print(sum)

while

i<- 1
while(i<=10){
 print(i)
 i<- i+1
}

for vs. while

When the iteration number is predictable and set in advance; for

Where the iteration number or other things may change depending on calculation results; while

subset(iris, Sepal.Length >= 5.0 & 
             Sepal.Length <= 6.0)[, 1:2]

idx<- c()
for(i in 1:nrow(iris)){
    if(iris[i, "Sepal.Length"] >= 5.0 &
       iris[i, "Sepal.Length"] <= 6.0){
       idx<- c(idx, i)
     }
}
print(idx)
iris[idx, c("Sepal.Length", "Sepal.Width")]

variable initialization

ss<-0
for(i in 1:100){
  ss<- ss+i
}
print(ss)

Assignment

  1. Number and sum of multiple of 3 between 1~100

  2. Program to print common multiple of 3 and 4 between 101~200

  3. Program to print divisor of 24

  4. Program to print 10!(factorial)

  5. Print forty Fibonacci Sequence start from 0.

# 1
sum<-0
count<-0
for(i in 1:100){
  if(i%%3==0){
    count<- count+1
    sum<- sum+i
  }
}
print(count)
print(sum)

# 2
for(i in 101:200){
  if(i%%12==0)
  print(i)
}

# 3
for(i in 1:24){
  if(24%%i==0){
    print(i)
  }
}

# 4
fact<- 1
for(i in 1:10){
  fact<- fact*i
}
print(fact)

# 5
fib1<- 0 
fib2<- 1
fib3<- 0
for(i in 0:39){
  if(i==0){
    print(fib1)
  }
  if(i==1){
    print(fib2)
  }
  fib3<- fib1+fib2
  fib1<- fib2
  fib2<- fib3
  print(fib3)
}

User Defined Function

sum(), min(), max()

mymax<- function(x,y){ # function(parameters1, parameter2)
 num.max<- x
 if(y>x){
   num.max<-y
 }
 return(num.max) # return(function)
}

mymax(10,15)
mymax(20,15)

Specify Default Value

mydiv<- function(x, y=2){ # declare default value
  result<- x/y
  return(result)
}

mydiv(x=10, y=3) # y=2 is ignored
mydiv(10,3) # y=2 is ignored
mydiv(10) # y=2 same as mydiv(10, 2)

return list()

myfunc<- function(x, y){
 val.sum<- x+y
 val.mul<- x*y
 return(list(sum=val.sum, mul=val.mul))
}

result<- myfunc(5,8)
result$sum
result$mul

When the parameters have no default values, input must be given.

Source function

setwd("c:/Rworks")
source("myfunc.R")

a<- mydiv(20, 4)
b<- mydiv(30, 4)
a+b
mydiv(mydiv(20, 2), 5)

Assignment

  1. Program a function lgm() which returns Greatest Common Denominator (GCD) with two integer inputs.

  2. Program a function maxmin() which returns max and min values of input vector by list.

# 1 
# GCD algorithm using 
# recursive function
lgm<- function(x,y){
  if(y==0){
    gcd<- x
  } 
  else{
    gcd<- lgm(y, x%%y)
  }
  return(gcd)
}

result<- lgm(10,8)
result
result<- lgm(10, 20)
result

# 2
maxmin<- function(v){
  val.max<- v[1]
  val.min<- v[1] # declare define values
  for(i in 1:length(v)){
    if(v[i]>v[1]){
      v[1]<-v[i] # update value of v[1] to maximum/minimum value
      # so we can compare to next v[i]
      val.max<- v[1]
    }
  } 
  for(i in 1:length(v)){ # distinguish val.min operation from val.max
    if(v[i]<v[1]){
      v[1]<-v[i]
      val.min<-v[1]
    }
  }
  return(list(max=val.max, min=val.min))
}

v1<- c(7, 1, 2, 8, 9)
result<- maxmin(v1)
result$max ; result$min
result<- maxmin(iris[,1])
result$max; result$min

apply function

repetitive statement of matrix, data frame, list

for(i in 1:4){
    mean(iris[,i])
}

apply(iris[,1:4], 2, mean) # column direction, mean
apply(iris[,1:4], 1, mean) # row direction, mean

lapply

lapply(iris[,1:4], mean) # column direction: without 2nd parameter
# mainly used for list

sapply: determine to show the result as a vector or list

sapply(iris[,1:4], mean) # vector 
sapply(iris[,1:4], mean, simplify=F) # list

apply(iris[,1:4], 2, mean) # sapply(iris[,1:4], mean)

User Defined Function - sapply

myfunc<- function(x){
 a<- max(x)
 b<- min(x)
 return(a-b)
}
sapply(iris[,1:4], myfunc)

Programming Example

Number matching game

n<- readline(prompt="Input number: ") # readline(): receive values from user
cat("Input number is", n, ". \n")

num<- round(runif(1)*100, digits=0) # runif(): generate a random value between 1 and 100
guess<- -1
cat("Guess a number between 0 and 100.\n")

while(guess !=num){ # continue if guess $$\neq$$ num
 guess<- readline(prompt= "Guess number : ")
 guess<- as.integer(guess) 
# as.integer(): convert character format into number
 if(guess==num){
   cat("Congratulations,", num, "is right.\n")
  } else if (guess < num){
   cat("It's smaller!\n")
  } else if (guess > num){
   cat("It's bigger!\n")
  }
}

Assignment

  1. Input three number to a funciton as parameters. Return biggest number.

  2. Receive 2 numbers from screen, print sum and multiplicaiton of two. (Repeat this until both numbers are 0)

# 1
biggy<- function(x, y, z){
  max<- x
  if(x<y | x<z){
    if(y<z)
      max<- z
    else
      max<- y
  }
  return(max)
}

result<- biggy(20, 100, 99)
result

# 2 #Error
a<- readline(prompt="Input: ")
a<- as.numeric(a)
b<- readline(prompt="Input: ")
b<- as.numeric(b)
while(a !=0 | b !=0){
  sum<- a+b
  mul<- a*b
  cat("Sum: ", sum, "\n",
     "Multiple: ", mul, "\n")
  
}

Tip

Print in file

sink("test.txt", append=T)
for(i in 1:100){
 print(i)
}
sink()

append = T: add edition

back next Index

tags: R

Comments

Post comment
Loading...

Share this: