ในการเรียนครั้งแรกบทแรก เราจะแนะนำให้ทุกคนรู้จัก Syntax หรือไวยากรณ์พื้นฐานของ R เพื่อที่ทุกคนจะได้เห็นว่า R มีคุณค่าและยิ่งใหญ่แค่ไหน
ง่ายสุดเลย เราสามารถใช้ R เป็นเครื่องคิดเลขแบบเก๋ ๆ ให้เราได้ โดยพิมพ์ code เหมือนเราคิดเลขปกติ แล่้วเอา cursur ไปวางบนบรรทัดนั้นแล้วก็กด Ctrl
ค้างไว้แล้ว Enter
3+5
## [1] 8
Ctrl
ค้างไว้แล้ว Enter
นั้นเป็นการสั่งให้ code ที่เราเขียนขึ้นทำการประมวลผลให้ได้คำตอบออกมา (ภาษาทางการเรียกว่า compile) เราสามารถทำการคำนวณที่ซับซ้อนขึ้นได้ โดยใช้สัญลักษณ์ต่อไปนี้
+
สำหรับการบวก-
สำหรับการลบ*
สำหรับการคูณ/
สำหรับการหาร^
สำหรับการยกกำลังลองดูตัวอย่างตามด้านล่าง
3*4^(2/7)
## [1] 4.457983
log10(24)
## [1] 1.380211
sqrt(29)
## [1] 5.385165
ข้างบนเป็นการคำนวณ
จะเห็นว่าเราสามารถคำนวณสมการพิสดารต่าง ๆ ได้มากมาย โดยการเขียนโค้ด ไม่เห็นต้องไปซื้อเครื่องคิดเลขเฉพาะทางเลย ในเมื่อเรามีคอมพิวเตอร์และ R อยู่แล้ว
ทดสอบความเข้าใจ
ลองเขียน code เพื่อคำนวณ - \(\sqrt{5\times5}\)
R ใช้สิ่งที่เรียกว่า object ในการทำงาน ทุกอย่างใน R จะถูกเก็บไว้ใน object ซึ่งเราสามารถสร้าง หรือ มอบหมาย (ภาษาอังกฤษใช้คำว่า assign) ค่าให้กับชื่อใหม่ โดยใช้ code <-
x <- 10
x
## [1] 10
code ด้านบน จะอ่านได้ว่า เราได้สร้าง object ใหม่ที่ชื่อ x
และได้มอบหมายตัวเลข 10 ให้เป็นค่าของ object ใหม่นี้ ดังนั้น object x
ของเรานี้ตอนนี้มีค่าเป็น 10 และเราก็สามารถทำอย่างอื่นกับ object นี้ได้ เช่น
x^2
## [1] 100
x*x
## [1] 100
เราสามารถตั้งชื่อ object เป็นอะไรก็ได้ตราบใดที่ไม่ได้ขึ้นด้วยตัวเลขและไม่มีช่องว่างในนั้น เช่น ผมจะสร้าง object ใหม่ที่ชื่อว่า my.height
เพื่อเก็บข้อมูลความสูงของผม แล้วมอบหมายเลข 165 เป็นค่าที่จะให้มันเก็บ
my.height <- 165
my.height
## [1] 165
เราสามารถเก็บข้อมูลที่เป็นตัวหนังสือได้ด้วย โดยใส่ฟันหนู `" " ไปรอบๆ คำของเราเช่น
my.name <- "bier"
my.name
## [1] "bier"
ทดสอบความเข้าใจ
ลองเขียน code เพื่อสร้าง object ที่ชื่อ my.height ขึ้นมาใหม่ แต่คราวนี้ใส่ความสูงของคุณเองลงไป แล้วหาร object ที่สร้างมาใหม่นี้ด้วย 100 เพื่อเปลี่ยนเป็นหน่วยเมตร
เราสามารถมอบหมายค่าหลาย ๆ ค่า ให้กับ object 1 อันได้ ตัวอย่างเช่น เราสามารถเก็บข้อมูลความสูงของเพื่อน 6 คน ใน object เดียวกันได้ โดยใช้คำสั่ง c()
แล้วใส่ความสูงของเพื่อนแต่ละคนเข้าไป และคั่นด้วย ,
ดังนี้
height <- c(1.75, 1.80, 1.65, 1.90, 1.75, 1.91)
height
## [1] 1.75 1.80 1.65 1.90 1.75 1.91
ตอนนี้ object ที่ชื่อว่า height
ชื่อเรียกใหม่ว่า vector ซึ่งเราสามารถทำการคำนวณกับทั้ง vector นี้ได้เช่นกัน ตัวอย่างเช่น เราสามารถเปลี่ยนความสูงทั้งหมดนี้เป็นหน่วยเซนติเมตรได้โดยการคูณ 100 กับทุกค่า ทั้งหมดแบบนี้
height*100
## [1] 175 180 165 190 175 191
หรือสำหรับคนรักสุขภาพ เราสามารถคำนวณดัชนีมวลกาย หรือ Body Mass Index (BMI) จากสูตรว่า
\[ BMI = \frac{weight}{height^2}\]
โดยการสร้าง vector สำหรับน้ำหนักขึ้นมาก่อนแล้วค่อยนำไปเข้าสูตร
weight <- c(60, 72, 57, 90, 95, 72)
bmi <- weight/height^2
bmi
## [1] 19.59184 22.22222 20.93664 24.93075 31.02041 19.73630
สิ่งที่ code นี้ทำคือ นำค่าแรกของ height
(1.75) มายกกำลังสอง ก่อนจะไปเป็นตัวหารของค่าแรกของ weight
(60) และทำอย่างนี้ซ้ำไปทุกค่า จนกว่าจะได้ค่าของทุกคน
R มีสิ่งที่เรียกว่า function ที่มากับโปรแกรมที่เราสามารถใช้การคำนวณทางสถิติและอื่น ๆ อีกมากมาย เราได้ใช้ function ตัวแรกไปแล้วก็คือ c()
ที่ทำหน้าที่เชื่อมข้อมูลเข้าด้วยกัน โดยทั่วไปแล้ว function ใน R จะเป็นคำกริยาที่ตามด้วย ()
ทันที (ไม่มีเว้นวรรค) เมื่อเราใส่ object เข้าไปในวงเล็บ function ก็จะทำหน้าที่นั้นกับ object นั้นทันที ตัวอย่างเช่น function ที่ชื่อว่า mean()
ใช้ในการหาค่าเฉลี่ยของ vector ของตัวเลข เราจะลองมาค่าเฉลี่ยของ vector weight
ที่เราสร้างไว้แล้วข้างต้น
mean(weight)
## [1] 74.33333
ทดสอบความเข้าใจ
เขียนโค้ดเพื่อคำนวณ
sd
)sum
)ของ weight
และ height
เราจะเริ่มจากกราฟง่าย ๆ ระหว่าง vector สองอันที่เราสร้างไว้แล้วคือ weight
และ height
โดยใช้ function ที่ชื่อว่า plot
plot(weight, height)
กราฟที่ได้ก็ดูสะอาดสบายตาดี แต่ว่าใน workshop นี้เราจะใช้ function จากชุดคำสั่ง (package) ที่เรียกว่า ggplot2
ในการวาดกราฟแทน เพราะจะได้กราฟสวยกว่ามากมาย เราสามารถติตตั้ง package เพิ่มเติมได้โดยการไปที่ Tools > Install Packages แล้วใส่คำว่า ggplot2 ลงในกล่องข้อความ แล้วกด Install ในกรณีเรา ตรงนี้น่าจะได้ทำไปแล้วตอนที่เราเตรียมการณ์
คำสั่งใน package จะไม่สามารถใช้ได้อัตโนมัติ เมื่อเราเริ่มใช้งาน R ปกติ จะต้องเรียกมันขึ้นมา (เหมือนปลุกผี!) โดยใช้ function library
หลังจากนั้นเราจะเอา vector สองอันมาประกบกันเป็นตารางข้อมูลด้วยคำสั่ง data.frame()
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 3.5.2
new.data <- data.frame(weight, height)
new.data
ตอนนี้เราได้ข้อมูล weight
กับ height
อยู่ในตารางเดียวกันแล้ว ตารางนี้มีชื่อใหม่ว่า new.data
เราสามารถใช้ object ใหม่นี้ วาดกราฟแบบสวย ๆ ได้ด้วย ggplot
ggplot(new.data, (aes(x = weight, y = height))) +
geom_point()
ยังไม่ต้องกังวลกับรายละเอียดตรงนี้มาก เดี๋ยวเราจะกลับมาดูในบทที่เราพุดถึงการวาดกราฟอย่างละเอียดอีกครั้ง
เราสามารถปรับเปลี่ยนกราฟได้โดยการใส่ข้อกำหนดเพิ่มเติมลงไปใน geom_point()
ตัวอย่างช่น
ก็ใส่คำว่า color =
ลงไปใน geom_point()
แล้วตามด้วยชื่อสีใน " "
ggplot(new.data, aes(x = weight, y = height)) +
geom_point(color = "blue")
หรือจะใช้รหัสสี HTML ก็ได้ (ลองดู http://html-color-codes.info)
ggplot(new.data, aes(x = weight, y = height)) +
geom_point(color = "#01DFD7")
ถ้าต้องการกำหนดรูปร่างและขนาดเพิ่ม ก็เติมข้อกำหนดเพิ่มลงไปหลัง “,” ตัวอย่างเช่น
ggplot(new.data, aes(x = weight, y = height)) +
geom_point(color = "red", size = 3, shape = 17)
รหัสของรูปร่างดูได้ตามนี้ :
ทดสอบความเข้าใจ
ลองวาดกราฟระหว่าง weight
กับ height
ใหม่ โดยเปลี่ยนสี รูปร่าง และ ขนาดของจุดดู ลองหลาย ๆ แบบ ก็ได้นะ
หัวข้อเป็นการแสดงศักยภาพของ R ในการทำกราฟหลาย ๆ แบบ เราจะเรียนรู้เกี่ยวกับกราฟพวกนี้มากขึ้นเมื่อเราเรียนรู้ขั้นสูงขึ้นไปเรื่อย ๆ สำหรับตอนนี้ลองกด compile code แต่ละอันดูและดูกว่าเกิดอะไรขึ้น โดยที่ยังไม่ต้องเข้าใจทุกรายละเอียดก็ได้
ด้านล่างเป็นข้อมูลความกว้างและความยาวกลีบดอกของดอกไม้ 3 ชนิด โดยเราเปรียบเทียบความยาวกลีบดอกระหว่างชนิด
data(iris)
ggplot(iris, aes(x = Species, y = Petal.Length, fill= Species)) +
geom_boxplot()
และดูความสัมพันธ์ระหว่างความกว้่างกับความยาว โดยใช้สีเป็นตัวแทนของแต่ละชนิด
ggplot(iris, aes(x = Petal.Width, y = Petal.Length, color= Species)) +
geom_point()
library(maps)
world <- map_data("world")
ggplot(data = world, aes(x=long, y = lat, group = group)) +
geom_polygon(fill = "brown") +
coord_fixed(1.3)
package ชื่อ desplot
สามารถช่วยเราออกแบบการทดลองภาคสนามได้ โดยเราจะใช้ข้อมูลตัวอย่างที่ืชื่อ yates.oats
จากอีกชุดคำสั่งหนึ่งคือ agridat
ซึ่งเป็นข้อมูลการผลิตข้าวโอ๊ตในสภาวะต่าง ๆ
library(desplot)
library(agridat)
data(yates.oats)
yates.oats
จากข้อมูลจะเห็นว่าเรามีทั้ง block และ gen เป็น treatment เราใช้คำสั่งด้านล่างนี้สร้าง field map ได้
desplot(block ~ col+row, yates.oats, col=nitro, text=gen, cex=1, out1=block, out2=gen, out2.gpar=list(col = "gray50", lwd = 1, lty = 1), main = "Blocked Design")