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

Image placeholder
แวะมาทักทายกันได้


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 ด้านล่างนี้เลย 

Course Online DATA ROCKIE Bootcamp

แวะมาทักทายกันได้
donate

Categories: Tutorial Tags: #Data Science , 855