บันทึกการใช้งาน RStudio และ R Programming 102 สำหรับนักวิทยาศาสตร์ข้อมูล Data Science - sprint 03

Control Flow With R
control flow เป็น building block ในการเขียนโปรแกรมใน R โดยมีคำสั่งที่สำคัญอยู่ 3 ตัว คือ
- if
- for
- while
หน้าที่ของ Control flow คือ การควบคุมการไหลของข้อมูลและพฤติกรรมของโปรแกรมที่เขียน เช่น
score ← 85
if(score ≥ 80) {
print(”passed”)
}else{
print(”failed”)
}
ถ้าคะแนนสอบมากกว่าหรือเท่ากับ 80 คะแนน จะสอบผ่าน (”passed”) แต่ถ้าไม่ ก็คือ ไม่ผ่าน (”failed”)
เราเขียน if เพื่อกำหนดเส้นทาง (path) การทำงานของโปรแกรม หรือ ถ้าเราเขียน for เราจะสามารถ loop ตัวแปร หรือ object ที่เราประกาศไว้ได้
IF in R - 01
If เป็น control flow ที่สร้างเงื่อนไขขึ้นมา
if(score ≥ 80) {
print("Passed")
}else{
print("Failed")
}
หรือ สร้างเงื่อนไขเพิ่ม หรือที่เรียกว่า ifelse
if(score >= 90){
print("Passed")
}else if(score >= 50){
print("OK")
}else {
print("Enroll again")
}
IFELSE in R - 02
จากตัวอย่างเมื่อสักครู่นี้ จะค่อนข้างยาว แต่มีฟังก์ชันของ R ที่เขียน ifelse ได้สั้นกว่ามาก
ซึ่งจากเดิมเราใช้ if block และ เขียน else block แต่ถ้าใช้ฟังก์ชัน ifelse ก็จะเขียนนี้
score = 88
ifelse(score >= 80, "passed", "Failed"
#passed
และถ้าต้องการจะแยกเงื่อนไขเพิ่มก็ซ้อนฟังก์ชัน ifelse เข้าไปในส่วนของ else ได้เลย
score = 45
ifelse(score >= 80, "passed", ifelse(score>=50, "OK", "Enroll Again"))
#Enroll Again
For loop in R - 03
ให้เราสร้าง vecter ขึ้นมาชุดหนึ่งแล้วใส่ตัวแปรชื่อ friends
จากนั้นก็ใส่เข้าไปในฟังก์ชัน for โดยสังเกตว่า โดยภาษาอื่นๆ for ในลักษณะนี้จะเรียกว่า foreach ตัวแปรตัวแรก จะเป็นค่าตัวแปร element ของ friends ที่มีอักษรเอส หมายถึงเพื่อนหลายคนอยู่
ส่วนฟังก์ชัน paste เป็นการนำข้อความไปต่อ string ที่ value ที่ for loop แสดงค่าออกมา
friends <- c("zhiang", "john", "Mary", "Anna")
for(friend in friends){
print(paste("Hi", friend))
}
#[1] "Hi zhiang"
#[1] "Hi john"
#[1] "Hi Mary"
#[1] "Hi Anna"
ยังมีฟังก์ชันอื่นที่ใช้งานมากกว่า จนแทบจะไม่ได้ใช้ for เลยเราเรียกมันว่า vectorization
vectorization
เราเพียงแค่ใช้ฟังก์ชัน paste()
ก็สามารถแสดงค่าใน vecter ได้เลย
paste("HI", friends)
#[1] "HI zhiang" "HI john" "HI Mary" "HI Anna"
อีกตัวอย่าง เป็น vectorization ที่ใช้กับ numeric
nums = c(4,6,8,10)
nums = nums + 2
nums
# 6 8 10 12
ถ้าเราใช้ for เราจะได้
for(n in nums){
print(n - 2)
}
#[1] 4
#[1] 6
#[1] 8
#[1] 10
จริงๆเราแค่
(nums <- nums - 2)
#[1] 4 6 8 10
ก็ได้ค่าเหมือนกัน สังเกตว่าเราอาจจะไม่ค่อยได้ใช้ for เลย
While loop in R - 04
while เป็นคำสั่ง control อีกตัวที่จะต้องกำหนดค่าต่างๆ ซึ่งมีอยู่ 3 ส่วนได้แก่
- ส่วนที่.1 ค่าเริ่มต้น
- ส่วนที่ 2 เงื่อนไข และ โปรเซส
- ส่วนที่ 3 กำหนด iterator
สังเกตว่าตั้งค่าเริ่มต้นตัวแปรชื่อ count เท่ากับ 0
แล้วกำหนดเงื่อนไขว่า ถ้า count น้อยกว่า 5 ให้แสดงค่า HI ด้วยฟังก์ชัน print()
แล้วเพิ่มค่า count ทีละ 1
แล้วจะได้ผลลัพท์เท่ากับ HI 5 ครั้ง
count <- 0
while (count < 5){
print("HI")
count <- count + 1
}
#[1] "HI"
#[1] "HI"
#[1] "HI"
#[1] "HI"
#[1] "HI"
Function in R - 05
ใน R ก็มี Functional Programming ที่เหมือนๆกับภาษาอื่นๆเช่นกัน ตัวอย่าง อย่าง code ด้านล่าง เช่น sum mean sd เป็นฟังก์ชันทางสถิติ
#function
# input -> f() -> output
x <- c(10, 25, 50, 100)
sum(x) # [1] 185
mean(x) # [1] 46.25
sd(x) # [1] 39.44933
Create Our First Function in R - 06
R ใช้ keyword function
ในการประกาศ function ใหม่
ยกตัวอย่าง
greeting = function (){
print("Hello World")
}
จาก code ด้านบนจะเป็นการประกาศ function ที่ไม่มี input โดยให้ print ว่า Hello World เมื่อเรียกใช้งาน
เวลาที่เรียกใช้งานก็แค่ เรียกชื่อ greeting ที่เราทำเป็นตัวแปรเอาไว้ ในที่นี้จะถูกมองว่าเป็นตัวแปร Object
greeting()
# [1] "Hello World"
greeting จะต้องตามด้วย วงเล็บเสมอจึงจะถูกมองว่าเป็น function สมมติว่าถ้าเราไม่ใส่วงเล็บมันจะแสดงค่า function code ที่เราเขียนไป
greeting
#function (){
# print("Hello World")
#}
คราวนี้เราจะสร้างฟังก์ชันที่มี input arguments ด้วย
greeting_name = function(name){
print(paste("Hello", name))
}
greeting_name("sklsongkiat")
#[1] "Hello sklsongkiat"
เราสามารถที่จะสร้างฟังก์ชันที่ซ้อนฟังก์ชันกันได้ เช่น
func <- function(){
greeting()
greeting_name("SKLSongkiat")
}
func()
#[1] "Hello World"
#[1] "Hello SKLSongkiat"
Function Parameter And Argument - 07
ศัพท์ที่ใช้การเขียน function มีสองคำ
- parameter
- argument
Parameter คือชื่อ named input ที่เราใส่ใน function
Argument คือ actual value ที่เราใส่ไปใน parameter นั้นๆ ตอนเรารัน function
ตัวอย่างเช่น
greeting() ← function(name = “sklsongkiat”) {
print( patse( “HI”, name))
}
- name คือ parameter
- “sklsonkiat” คือ argument
ตรงคำว่า sklsongkiat เป็น default parameter สามารถตั้งเอาไว้ล่วงหน้าได้
เราสามารถที่จะรับ parameter ได้มากกว่าหนึ่ง parameter เช่น
greeting <- function(name = "sklsongkiat", age = 14) {
print( paste( "HI ", name))
print( paste( "age: ", age))
}
greeting()
#[1] "HI sklsongkiat"
#[1] "age: 14"
กรณีที่เราไม่ได้ใส่ input เข้าไปในฟังก์ชัน มันจะเอาค่า default ที่ตั้งเอาไว้มาแสดง
แต่ถ้าเราอยากก็ reuse ฟังก์ชันและ overwrite ชื่อ argument เข้าไปก็เพียงแค่ ใส่ชื่อเป็น input เข้าไป เช่น
greeting("zhing", 36)
#[1] "HI zhing"
#[1] "age: 36"
Function Karta - 08
ฝึกเขียน 3 function ใน R
add_two_nums()
cube()
count_ball()
add_two_nums
add_two_nums <- function(val1, val2){
return(val1 + val2)
}
#add_two_nums(1,2)
#3
cube()
cube <- function(base, power=3){
return(base ** power)
}
#cube(5,2)
# 25
count_ball()
balls <- c("red", "red", "blue", "green", "green", "green", "green", "red") count_ball <- function(balls, color) {
sum(balls == color)
}
ฟังก์ชัน count_ball จะเป็นการนับสีของลูกบอล
สมมติว่า เราสร้าง vecter ball ขึ้นมาหนึ่งชุด
และสร้าง function count_ball ขึ้นมา
เวลาที่เราเรียก balls เราสามารถเช็คได้ว่า ค่าไหนเป็นจริงโดยการใช้ balls == "red”
แล้วผลลัพท์จะออกมาเป็น boolean
เช่น
balls == "red"
#TRUE TRUE FALSE FALSE FALSE[6] FALSE FALSE TRUE
แต่แบบนี้ค่อนข้างดูยาก เราจะใช้ sum()
เข้ามาช่วย
sum(balls == "red")
#3
Looping Over a dataframe - 09
data() เป็นฟังก์ชัน dataset ใน R ให้ลองเล่นได้
สมมติว่า เราอยากจะลองเล่น dataset ที่ชื่อว่า USArrest
ซึ่งเป็น dataset ที่เกี่ยวกับ อาชญากรรมใน US เราสามารถพิมพ์ชื่อ dataset
ตรงๆเพื่อเรียกดูข้อมูลเบื้องต้นได้ แต่ในหัวข้อนี้จะเป็นการใช้งานร่วมกับ dataframe เราจึงใช้ View()
เป็นการสร้างตารางขึ้นมา
เหตุผลที่ทำไมเราจะต้องมาเขียน loop บน data frame กัน สมมติว่าเราอยากจะหาค่า เฉลี่ยโดยใช้ฟังก์ชัน mean กับ dataset USArrest เราจะเขียนแบบนี้
ใน Dataset USArrest จะมีอยู่ 4 Column
mean(USArrests$Assault)
mean(USArrests$Murder)
mean(USArrests$Rape)
mean(USArrests$UrbanPop)
เราอาจจะเขียนแบบนี้เพื่อเรียกข้อมูลจาก column ทั้ง 4 column เขียนแบบนี้ซ้ำๆได้ แต่ว่าสมมติว่าเราไปเจอ dataset ที่มีหลาย column เราอาจจะเสียเวลามากเกินไป
เราอาจจะลองเช็คข้อมูลเบื้องต้นกันก่อนเช่น
ดูจำนวนแถวทั้งหมดใน dataset
nrow(USArrests)
# 50
ดูจำนวนคอลัมน์ทั้งหมดใน dataset
ncol(USArrests)
# 4
ดูข้อมูล 5 แถวแรก
head(USArrests)
ทั้ง 3 คำสั่งเป็นการ explore data เบื้องต้น
สมมติว่าเราอยากจะดูชื่อคอลัมน์เราสามารถที่ for loop ออกมาได้
for( i in 1:ncol(USArrests)){
print(names(USArrests[i]))
}
แต่จริงๆแล้วเราไม่ต้องเขียน for เพียงแค่เราใช้ฟังก์ชัน names() เราก็จะได้ชื่อคอลัมน์ออกมาเหมือนกัน
names(USArrests[i])
#[1] "Murder" "Assault" "UrbanPop" "Rape"
แต่เราจะใช้ for เมื่อครู่นี้มาหาค่าเฉลี่ยของแต่ละ column
for( i in 1:ncol(USArrests)){
print(names(USArrests[i]))
print(mean(USArrests[[i]]))
}
#[1] "Murder"
#[1] 7.788
#[1] "Assault"
#[1] 170.76
#[1] "UrbanPop"
#[1] 65.54
#[1] "Rape"
#[1] 21.232
Apply() coolest function - 10
ใน R มีฟังก์ชัน apply() ที่เราใช้เขียนแทน loop ได้ทั้ง column, rows
ref: https://www.rdocumentation.org/
#apply function
apply(mtcars, MARGIN = 2, mean)
จาก code ด้านบนจะเป็น คำสั่งที่เราไม่ต้องเขียนเอง โดยเราสามารถเรียก apply แล้วใส่ dataset ชื่อ mtcars และ MARGIN จะเป็นการบอกให้ฟังก์ชัน วิ่งเข้าเอาข้อมูลในลักษณะไหน กรณีที่เป็นเลข 1 คือ เข้าไปอ่านข้อมูลใน แนวแถว row และ กรณีที่เป็นเลข 2 คือ เข้าไปอ่านข้อมูลในแนวคอลัมน์ แล้วสุดท้ายใส่ชื่อฟังก์ชันที่ต้องการจะแปลงข้อมูลเข้าไป คือ mean เราก็จะได้ข้อมูลค่าเฉลี่ย เหมือนกับที่เขียนในหัว 09 เลย
apply(mtcars, MARGIN = 2, mean)
mpg cyl disp hp drat
20.090625 6.187500 230.721875 146.687500 3.596563
wt qsec vs am gear
3.217250 17.848750 0.437500 0.406250 3.687500
carb
2.812500
apply(mtcars, MARGIN = 2, mean)
apply(mtcars, MARGIN = 2, sum)
apply(mtcars, MARGIN = 2, sd)
apply(mtcars, MARGIN = 2, median)
คอร์สนี้ดีมากกกก (ไก่ ล้านตัว) ใครอ่านจบ แนะนำว่าให้ไปสมัครเรียน ติดตามได้ที่ link ด้านล่างนี้เลย
