R Language 101: Very Basic
สวัสดีครับ วันนี้ผมจะมาแชร์สิ่งที่ผมได้เรียนรู้ผ่านมาสักระยะหนึ่งนั่นก็คือ R langauge ครับ ภาษา R เป็นภาษาคอมพิวเตอร์ ที่มีการทำงานคล้าย ๆ กับภาษา Python, C และ C++ ซึ่งมักจะเป็นที่นิยมในการหาหรือวิเคราะห์ข้อมูลทางสถิติ โดยผมจะมาแนะนำและวิธีการใช้งานเบื้องต้นเพื่อให้เพื่อน ๆ สามารถที่จะนำไปประยุกต์ใช้ได้ ซึ่งข้อดีหลักของ ภาษา R คือ
- ผู้เรียนสามารถเรียนรู้ได้เร็ว
- เป็นเส้นทางสำหรับผู้เริ่มต้นสถิติหรือ Machine Learning
- มี IDE (integrated development environment) ที่ง่ายต่อ Data Science ใช้ในการทำงาน
โดยมาเริ่มตั้งแต่การติดตั้งภาษา R กันเลยครับ โดยเพื่อน ๆ สามารถที่จะติดตั้ง IDE ลงในเครื่องหรือจะสามารถที่จะเขียนโค้ดบนบราวเซอร์ ก็ได้ครับ สามารถเข้าไปดาวน์โหลดเวอร์ชันที่ฟรีได้ที่ Rstudio แล้วติดตั้งแบบปกติเลยครับ และ ติดตั้ง Base R ให้เลือกตาม OS (Operation System) ที่เพื่อน ๆ ใช้กัน
หรืออีกช่องทางหนึ่งคือ Rstudio clound โดยให้เข้าไปทำการสมัครสมาชิกด้วย Free plan ได้เลยครับ แต่จะมีข้อจำกัดจำนวนชั่วโมงในการใช้ น่าจะ 25 ชั่วโมง ต่อ 1 เดือน
มาเริ่มกันเลยครับ โดยผมจะใช้ตัว R Studio นะครับ เริ่มมาให้ทำการ Create new file ขึ้นมาครับ
การประกาศตัวแปร
เริ่มด้วยการประกาศตัวแปร โดยเพื่อน ๆ สามารถที่จะประกาศตัวแปรอะไรขึ้นมาก็ได้ โดยไม่ต้องทำการประกาศ Data type
- การตรวจสอบ Type ของตัวแปรได้โดยใช้ฟังก์ชัน Class ()
- <- เครื่องหมายมีค่าเท่ากับเครื่องหมาย = แต่ในผู้เขียน R จะใช้ <- มากกว่าครับ
## Create Variable
id <- 1
class(id)
name <- "phone A"
class(name)
price <- 23000.99
class(price)
- สามารถที่จะทำการรันโค้ด โดยใช้คีย์ลัดคือ Command + Enter (mac), Control + Enter (window) จากนั้นโปรแกรมจะแสดงผลลัพธ์อีกหน้าต่างนึงครับ
ชนิดของข้อมูล Datatype
Numeric
คือชนิดของข้อมูลที่ประกอบไปด้วยตัวเลขที่สามารถที่จะเป็นทศนิยม หรือจำนวนเต็ม
number_one <- 20.4 #numeric
class(number_one)
print(number_one)
"numeric"
20.4
Integer
คือชนิดของข้อมูลที่ประกอบไปด้วยตัวเลขจำนวนเต็ม แต่โดยปกติ Data type ของตัวเลขเมื่อนั้นจะเป็น Numeric แต่สามารถที่จะแปลงให้เป็น Integer ได้โดยใช้ as.integer ()
number <- as.integer(77)
class(number)
print(number
"Integer"
77
Character
คือชนิดข้อมูลที่ประกอบไปด้วยอักขระตัวอักษร โดยจะมีเงื่อนไขต้องอยู่ภายใน double quoat (“ ”) หรือ single quoat (‘ ’)
coin_a <- "Shiba Inu Coin"
coin_b <- "Doge Coin"
cat(coin_a, class(coin_a))
cat(coin_b, class(coin_b))
Shiba Inu Coin character
Doge Coin character
*cat () ย่อมาจาก cat: Concatenate and Print เป็นฟังก์ชันที่ใช้ในการต่ออักขระตัวอักษรครับ
Logical
คือชนิดของข้อมูลที่มีค่าเป็น TRUE หรือ FALSE
is_bear_season <- TRUE
is_bull_season <- FALSE
cat(is_bear_season, class(is_bear_season))
cat(is_bull_season, class(is_bull_season))
TRUE logical
FALSE logical
Factor
คือชนิดของข้อมูลที่จัดเก็บเป็นชนิดหรือ categories (เพศ [หญิง, ชาย], รถ [gear auto, not auto] โดยจะใช้คู่กับฟังก์ชัน C () เพื่อสร้างข้อมูลที่เป็น Factor โดยภายในจะสามารถเป็นได้ทั้งตัวเลขจำนวนเต็ม ตัวอีกษร หรือ Logical แต่ชนิดของข้อมูลจะเป็นได้แค่ชนิดเดียว เช่น
c(1, TRUE)
c("a", "b", 1)
c(1,2,3)
ผลลัพธ์ที่ได้ออกมาจะเป็น
"a" "b" "1"
1 2 3
1 1
Data Structure
List
คือชนิดข้อมูลที่สามารถเก็บข้อมูลได้หลายประเภท เช่น character, numeric, vector, boolean, integer และยังสามารถเก็บข้อมูลประเภท Matrix หรือ List ตัวมันเองก็ได้ เช่น
list_a <- list("a", 6, 6.5, TRUE, c("Coin", "Token"))
> list_a[[1]][1] "a"[[2]][1] 6[[3]][1] 6.5[[4]][1] TRUE[[5]][1] "Coin" "Token"
Vector
เป็นชนิดของข้อมูลที่สามารถเก็บข้อมูลได้หลายชนิดเหมือนกัน แต่ชนิดข้อมูลชนิดนี้มักจะถูกใช้เก็บข้อมูลที่ถูกเรียงลำดับ
seq(1,10,2)
Seq เป็นฟังก์ชันที่ใช้ในการสร้างตัวเลข ตั้งแต่ตัวที่ N:N เมื่อ N เป็นจำนวนเต็ม โดยต้องระบุ From เลขเริ่มต้นและ To จะเป็นเลขสิ้นสุด ส่วน by จะเป็นการให้เพิ่มขึ้นทีละเท่าไหร่
seq(from, to, by)
เมื่อทำการรันคำสั่งก็จะทำการสร้างตัวเลขตั้งแต่ 1-10 โดยจะเพิ่มขึ้นทีละ 2 ขึ้นมา
1 3 5 7 9
Matrix
เป็นชนิดของข้อมูลที่จะถูกจัดเก็บให้เป็นในรูปแบบ matrix คือจะมิมิติขึ้นมา ซึ่งในแต่ละมิติก็จะจัดเก็บ charector ส่วน integer มักจะถูกใช้ในการคำนวนทางคณิตศาสต์เป็นหลัก
matrix(c(1:9), nrow = 3, byrow = TRUE)
ผลลัพธ์ที่ได้จากการรันคำสั่งจะได้เป็น matrix ขนาด 3 * 3 ซึ่งเรื่มตั้งแต่เลข 1-9
DataFrame
เป็นชนิดของข้อมูลที่คล้าย table หรือ การจัดเก็บข้อมูลแบบ 2 มิติ ในแต่ column จะประกอบไปด้วยข้อมูล และในแต่ละ row จะประกอบไปด้วย Set ของข้อมูลของแต่ละ Column
coin_id <- c(1:4)
coin <- c("bitcoin", "kub coin", "doge coin", "shiba inu")
price <- c("2000000.0", "80.0", "9.5", "0.03")
data.frame(coin_id ,coin, price)
If - Else Statement
การใช้ If Else ในภาษา R จะมีความคล้ายคลึงกันทำให้สามารถเขียนแล้วเข้าใจได้ง่าย ซึ่ง If Else นั้นจะเอาไว้ใช้ในการตรวจสอบเงื่อนไขถ้า...แล้วให้ทำ… เช่น
token_price = 200
if (token_price > 1000){ print("Sell!!")}else{ print("Buy!!")}[1] "Buy!!"
การใช้ For Loop ในภาษา R นั้นก็มีลักษณะคล้ายกับภาษา Python ซึ่ง For Loop ใช้ในการวนลูปชุดข้อมูล เช่น FOR LOOP
For ( i in dataset){
“Do something”
}
for(i in c("bitcoin", "kub coin", "doge coin", "shiba inu")){ print(i)}
เมื่อทำการรันคำสั่งก็จะได้ผลลัพธ์ดังนี้ครับ
> for (i in c("bitcoin", "kub coin", "doge coin", "shiba innu")){+ print(i)+ }[1] "bitcoin"[1] “kub coin"[1] “doge coin"[1] "shiba inu"
Fizz buzz Code
โดยโจทย์นี้เป็นให้แสดงคำว่า
- Fizz หากตัวเลขที่ส่งเข้าไปสามารถหารด้วย 3 ลงตัว
- Buzz หากตัวเลขที่ส่งเข้าไปสามารถหารด้วย 5 ลงตัว
- Fizz-buzz หากตัวเลขที่ส่งเข้าไปสามารถหารด้วย 3 และ 15 ลงตัว
โดยครั้งนี้เราจะมาเตรียม test กันก่อนนะครับ
- ทำการสร้าง Folder -> testthat
- สร้างไฟล์ My_code.R ใช้ในการเขียนฟังก์ชัน
- สร้างไฟล์ Test_my_code.R ใช้ในการเขียน Test case กันครับ
จากนั้นเริ่มทำการเขียน Test case กันก่อนโดยเริ่มจาก Case แรก
- Fizz หากตัวเลขที่ส่งเข้าไปสามารถหารด้วย 3 ลงตัว
ขั้นตอนการเขียนเทสโดยใช้ Library test_that () ส่วนในฟังก์ชัน expect_equal ใช้ในการเปรียบเทียบค่าครับว่าเท่ากันหรือไม่
test_that("test name", {
expect_equal(valueA, valueB)}
test_my_code.R
library(testthat) #-> import library
source("my_code.R", chdir = TRUE) # -> file code
test_that("test input 3 should return fizz", { expect_equal(fizz_buzz(3), "fizz")})
ส่วนใน Code ก็จะทำการเขียนฟังก์ชัน Fizzbuzz รับ Number เข้ามาตรวจสอบว่าถ้ามันเป็นตัวเลข 3 ให้ทำการ Return fizz กลับไปครับ
My_code.R
fizz_buzz <- function(number){ if (number == 3){ return("fizz") }}
เมื่อทำการรัน Unittest โดยใช้ โดยจะทำการรันด้วยคำสั่ง Testthat::test_dir () ส่วนใน test_dir() นั้นจะเป็น Pathไปยัง Test/testthat
testthat::test_dir("~/learntoday2/fiss_buzz/test/testthat")
จากรูปจะเห็นว่าทำการรัน Unittest ที่ทำการเขียนไว้ ส่วนกรณีที่ Testcase Fail นั้นก็จะทำการบอกว่า มันมีค่าอะไรที่ไม่ตรงกัน ก็จะไปทำการแก้ให้ผ่าน
เมื่อเขียน coe และ unittest เสร็จ ก็จะได้โค้ดที่ประมาณนี้ครับ อาจจะมีแตกต่างกันบ้างแล้วแต่วิธีการเขียนของเพื่อน ๆ ครับ ซึ่งก็ไม่ผิดครับ
Test_my_code.R
library(testthat)
source("my_code.R", chdir = TRUE)
test_that("test input 3, 6, 9 should return fizz", { expect_equal(fizz_buzz(3), "fizz") #expect_equal(fizz_buzz(6), "fizz") #expect_equal(fizz_buzz(9), "fizz")})
test_that("test input 5, 10, 20 should return buzz", { expect_equal(fizz_buzz(5), "buzz") expect_equal(fizz_buzz(10), "buzz") expect_equal(fizz_buzz(20), "buzz")})
test_that("test input 15, 30, 45 should return fizz-buzz", { expect_equal(fizz_buzz(15), "fizz-buzz") expect_equal(fizz_buzz(30), "fizz-buzz") expect_equal(fizz_buzz(45), "fizz-buzz")})
My_code.R
fizz_buzz <- function(number){ if (number %% 3 == 0 && number %% 5 == 0){ return("fizz-buzz") } else if(number %% 3 == 0){ return("fizz") } else if(number %% 5 == 0){ return("buzz") }}
คีย์ลัด
- CMD/Ctr + Enter ใช้ในการรันไฟล์
- control/Ctr + L ใช้ในการเคลียร์หน้าต่าง
สรุป
สำหรับตัว R Very Basic 101 นั้นก็จะประกอบไปด้วยข้อมูล
- การประการตัวแปร
- ชนิดของข้อมูล Datatype
- If - Else Statement
- For loop
- Fizz buzz code
ซึ่งก็จะสามารถทำให้เพื่อนสามารถที่จะนำเนื้อหาภายในบล็อกนี้มาใช้เบื้องต้นในการเขียนฟังก์ชันในการคำนวน หรือจะเอาไปต่อยอดในการทำสถิติต่าง ๆ ได้ครับ
อ้างอิง
- cat: Concatenate and Print. RDocumentation
- Factors in R. Olivia Smith
- seq: Sequence Generation RDocumentation
- Unit Testing in R André Müller