ทำไมจึงควรใช้ภาษาอาร์(R)

ภาษาอาร์เป็นภาษาทางคอมพิวเตอร์แบบหนึ่งที่ถูกสร้างขึ้นมาเพื่อประยุกต์ใช้ในทางสถิติไม่ว่าจะการคำนวณค่าสถิติต่างๆ เช่น ค่าเฉลี่ย ความความแปรปรวน การทดสอบสมมุติฐาน หรือการพยากรณ์ทั้งทางวิทยาศาสตร์ สังคมศาสตร์ เศรษฐศาสตร์ และด้านอื่นๆ อีกมากมาย ภาษาอาร์เป็นภาษาที่ใช้นำมางานได้ฟรีไม่เสียค่าลิขสิทธิ์ และมีพัฒนาปรับปรุงตลอดเวลา และเป็นภาษาที่สามารถศึกษาหาความรู้จากแหล่งต่างๆได้ง่าย เนื่องเป็นภาษาทางคอมพิวเตอร์ที่ได้รับความนิยมมากในปัจจุบันเช่น

  • r-bloggers

  • sthda

  • datacamp เรียนออนไลน์ฟรีสำหรับบทเรียนเบื้องต้น

และสามารถทำงานได้บนระบบปฎิบัติการ window osx และ linux และมีผู้ผู้พัฒนาชุดคำสั่งที่ประสิทธิภาพสูงออกมาให้ใช้งาน มากมาย เช่น

  • tidyvese สำหรับงานทางวิทยาศาสตร์ข้อมูล

  • rugarch สำหรับการพยากรณ์ข้อมูลประเภทอนุกรมเวลา

  • keras สำหรับงานประเภทปัญญาประดิษฐ์ (deep learning)

  • ggplot2 สำหรับการสร้างกราฟ 2 มิิติชนิดต่างๆ ที่มีความสวยงามและใช้งานง่าย เป็นส่วนหนึ่งของชุดคำสั่งของ tidyverse

อาร์เป็นภาษาที่ได้รับความนิยมมากขึ้นเรื่อยๆ และเป็นภาษาที่ได้รับความนิยมสำหรับงานที่เกี่ยวข้องกับวิทยาศาสตร์เชิงข้อมูล(data science) รองจากภาษาไฟทอน(Python)

สามารถdownload โปรแกรม R และ Rstudio ได้จาก

ชนิดของข้อมูล

ข้อมูลในภาษาอาร์มีหลายประเภทสำหรับเช่น ตัวเลข(numeric) จำนวนเต็ม(interger) จำนวนจินตภาพ(complex) ตัวอักษร(character) ตรรกะ(logical) เวลา(date) เราจะใช้คำสั่ง class() เพื่อเช็คชนิดของตัวแปร ดังนี้

class(3.5)
## [1] "numeric"
class(2L)
## [1] "integer"
class(as.integer(2))
## [1] "integer"
class(TRUE)
## [1] "logical"
class(2+3i)
## [1] "complex"
class("2.5")
## [1] "character"
class("TRUE")
## [1] "character"
class("Somsak")
## [1] "character"
class(as.Date("2018-08-20"))
## [1] "Date"

ข้อมูลแบบเวคเตอร์(vector)

เวคเตอร์เป็นข้อมูลที่ถูกเก็บหรือสร้างตั้งแต่ 1 ค่าขึ้นไป โดยใช้คำสั่ง “c( )” และในวงเล็บข้อมูลแต่ละตัวจะถูกคั้นด้วยเครื่องหมาย “,” เช่น

c(1,2,4,5)
## [1] 1 2 4 5
c(TRUE,FALSE,T,F)
## [1]  TRUE FALSE  TRUE FALSE
c(TRUE,1,3)
## [1] 1 1 3
c("a","B")
## [1] "a" "B"
c(2,3,"4")
## [1] "2" "3" "4"

ข้อมูลแบบตรรกศาสตร์ มีค่าความจริง เป็น TRUE และ FALSE ซึ่งกำหนดค่าเป็น 1 และ 0 ตามลำดับ สำหรับภาษาอาร์สามารถเขียนได้สองแบบคือ แบบเต็มและย่อ คือ TRUE หรือ T และ FALSE หรือ F เพื่อป้องความสับสนในหนังสือนี้จะเขียนแบบเต็มเท่านั้น และข้อสังเกตุ ข้อมูลแบบเวคเตอร์สามารถเก็บข้อมูลได้เพียงชนิดเดียวเท่านั้น เช่นเป็นตัวเลข หรือเป็นตัวอักษร ถ้ามีการผสมกันระหว่างตัวเลขกับตัวอักษร เวคเตอร์นี้จะเป็นตัวอักษร ถ้าผสมกันระหว่างจำนวนกับตรรกศาสตร์ จะถูกเก็บเป็นจำนวนตามตัวอย่างข้างต้น คำถาม ถ้าเป็นการผสมกันระหว่างตัวเลขจำนวนจริงกับจำนวนเชิงซ้อนเช่น

c(2,1+3i)
## [1] 2+0i 1+3i

จะเป็นข้อมูลชนิดใด ให้ผู้อ่านทดลองทำดู

ลำดับ(sequence)

ในกรณีที่ต้องสร้างลำดับจำนวนเต็มที่เพิ่มขึ้นทีละ 1 เช่น เวคเตอร์ 1 ถึง 10 สามารถใช้คำส่งย่อได้โดย

1:10
##  [1]  1  2  3  4  5  6  7  8  9 10

ในกรณีที่ลำดับตัวเลขที่ไม่ได้เป็นจำนวนเต็มที่เพิ่มขึ้นทีละ 1 สามารถใช้คำสั่ง seq(from,to,by) โดยที่

  • from คือค่าเริ่มต้น

  • to คือค่าสุดท้ายจะเพิ่มขึ้นไม่เกินเท่าไหร่ หรือลดลงไม่ต่ำกว่าเท่าไหร่

  • by ค่าที่ต้องการให้ข้อมูลในเวคเตอร์ตัวต่อไปเพิ่มขึ้นหรือลดลงครั้งละเท่าไหร่

เช่น เริ่มต้นที่ 2 แต่ไม่เกิน 10 เพิ่มขึ้นทีละ 2

seq(from=2,t=10,by=2)
## [1]  2  4  6  8 10
# เขียนโดยย่อ
seq(2,10,2)
## [1]  2  4  6  8 10

หรือ เริ่มต้นที่ 10.5แต่ไม่น้อยเกิน 2 ลดลงทีละ 3

seq(10.5,2,-3)
## [1] 10.5  7.5  4.5

ถ้าต้องลำดับเป็นตัวอักษรเช่น a ถึง j หรือ A ถึง J สามารถใช้คำสั่งดังนี้

letters[1:10]
##  [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"
LETTERS[1:10]
##  [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J"

สำหรับคำสั่ง letters หรือ LETTERS จำเป็นต้องทราบว่าตัวอักษรที่ต้องการนั้นอยู่ในตำแหน่งที่เท่าไหร่ เช่น เรารู้ว่า a อยู่ตำแหน่งที่ 1 และ j อยู่ตำแหน่งที่ 10 คำถาม ถ้าต้องต้องการสร้างเวคเตอร์ ที่ตัวอักษรภาษาอังกฤษตัวใหญ่ที่เป็นลำดับเลขคู่ทั้งหมดจะใช้คำสั่งใด โดยเรียงจากตัวแรกไปหาตัวสุดท้าย ? ถ้าต้องต้องการสร้างเวคเตอร์ ที่ตัวอักษรภาษาอังกฤษตัวเล็กทั้งหมดที่ลำดับตัวอักษรสามารถหารด้วย 3 ได้ลงตัว โดยเรียงจากตัวหลังมาหาตัวหน้า ?

การทำซ้ำเวคเตอร์

คำสั่งสำหรับการสร้างเวคเตอร์จำนวน ตัวษร หรือตรรกศาสตร์ ซ้ำๆ กัน สามารถใช้ คำสั่ง rep(x,each) หรือ rep(x,times) หรือ rep(x,each,times)โดยที่

  • x เป็นเวคเตอร์ที่ต้องการทำซ้ำ

  • each คือจำนวนครั้งที่ต้องทำซ้ำในทุกตำแหน่ง

  • times จำครั้งที่ต้องการทำซ้ำทั้งเวคเตอร์

เช่นให้ทำซ้ำ เช่น

rep(x=1,each=5) # ทำซ้ำตำแหน่งที่ 1  5 ครั้ง
## [1] 1 1 1 1 1
# สามารถเขียนโดยย่อ
rep(1,times =5) # ทำซ้ำเวคเตอร์ 1 5 ครั้ง
## [1] 1 1 1 1 1
rep(c(1,2),5)   # ทำซ้ำเวคเตอร์ c(1,2) 5 ครั้ง
##  [1] 1 2 1 2 1 2 1 2 1 2
rep(c(TRUE,FALSE),each=3) # ทำซ้า ตำแหน่งละ 3 ครั้ง
## [1]  TRUE  TRUE  TRUE FALSE FALSE FALSE
rep(c(TRUE,FALSE),each=3) # ทำซ้า เวคเตอร์ c(TRUE,FALSE) 3 ครั้ง
## [1]  TRUE  TRUE  TRUE FALSE FALSE FALSE
rep("a",6)
## [1] "a" "a" "a" "a" "a" "a"
rep(c("a","b","c"),3)
## [1] "a" "b" "c" "a" "b" "c" "a" "b" "c"

ในกรณีที่ต้องทำซ้ำทีละตำแหน่งโดยเท่าๆ กัน เช่น จากเวคเตอร์ c(1,2) ไปเป็น c(1,1,2,2) สามารถทำได้โดยเปลี่ยนจากคำว่าเป็น times ดังนี้

rep(c(1,2),each=2)
## [1] 1 1 2 2

ข้อสังเกตุ ถ้าเขียนคำสั่งโดยย่อจะเป็นการใช้ times ไม่ใช่ each และถ้าใช้ทั้ง each และ times times จะเป็นดังนี้

rep(c(1,2),each=2, times=3)
##  [1] 1 1 2 2 1 1 2 2 1 1 2 2
rep(c(1,2),time=3, each=2)
##  [1] 1 1 2 2 1 1 2 2 1 1 2 2

ถ้าใช้ทั้ง each และ times ร่วมกัน โปรแกรม จะทำซ้ำที่ตำแหน่งก่อน แล้วถึง ค่อยทำซ้ำจากทั้งเวคเตอร์ รายละเอียดเพิ่มเติม สำหรับคำสั่ง rep ให้ใช้ คำสั่ง ?rep

การกำหนดค่าตัวแปร

ก่อนจะพูดถึงข้อมูลชนิดอื่นๆต่อไป ขอพูดถึงการการกำหนดค่าตัวแปรในภาษาอาร์ การกำหนดค่าตัวแปรคือการให้คอมพิวเตอร์เก็บค่าตัวแปรนี้ไว้หน่วยความจำ เพื่อประโยชน์ในการเรียกใช้ภายหลัง กฎการตั้งชื่อตัวแปรสำหรับภาษาอาร์คือ

  • ตัวแรกควรต้องภาษาอังกฤษจะเป็นตัวพิมพ์เล็กหรือพิมพ์ใหญ่ก็ได้หลังจากนั้นสามารถตามด้วยตัวเลขอารบิกหรือ . หรือ _ ก็ได้

  • ชื่อของตัวแปรต้องไม่เป็นคำสงวนในภาษาอาร์ เช่น TRUE if else เป็นต้น (คำสงวนอื่นๆ สามารถดูได้โดยใช้คำสั่ง ?reserved )

  • ในชื่อของตัวแปรต้องไม่มี สัญลักษณ์ทางคณิตศาสตร์ในการทำพีชคณิต (+,-,*,/,%%,%/%,^)

  • สัญลักษณ์ที่ใช้ในการเปรียบเทียบหรือหาความสัมพันธ์ (<,<=,>,>=,==,!=)

  • สัญลักษณ์ในการกำหนดค่าของโปรแกรมอาร์ (<-,=,->) สัญลักษณ์ในการหาค่าทางตรรกศาสตร์(!,&,|,||)

  • สัญลักษณ์พิเศษเช่น #, @ $,[ ,],(,),{,}

การสร้างตัวแปรสามารถ ทำได้ดังตัวอย่างต่อไปนี้

# ตัวแปร Age สำหรับเก็บค่าอายุ
Age    <- c(14,14,15,16,20)
# ตัวแปร sex3 สำหรับเก็บค่า เพศชาย และหญิง เป็นภาษาอังกฤษ
sex3 <- c("Male","Female")
# ตัวแปร Salary เก็บข้อมูลเงินเดือน
Salary =c (30000,25000,50000)
# ตัวแปร Test_result เก็บค่าตรรกศาสตร์
Test_result=     c(TRUE,FALSE,TRUE,TRUE)
# ตัวแปร Student.Birthday เก็บข้อมูลของเวลา
Student.Birthday=as.Date(c("2011-06-28","2012-12-15"))

การกำหนด่าตัวแปร จากตัวอย่างจะเห็นสามารถใช้ <- หรือ = ก็ได้ในกำหนดค่าให้ตัวแปรผู้อ่านสามารถเลือกใช้ได้ตามความพอใจ แต่เพื่อความเป็นระเบียบและไปตามหลักสากล

  • <- จะใช้ในกรณีที่สร้างตัวแปรชื่อต่างๆ เพื่อเก็บค่าไว้ในหน่วยความจำ เช่น ตัวแปรข้อมูลชนิดเวคเตอร์ เมตริกซ์ หรือ กรอบข้อมูล ให้มีค่าตามที่เรากำหนด

  • = จะใช้สำหรับการกำหนดค่าภายในฟังก์ชัน หรือชุดคำสั่งที่เราต้องการจะใช้

และจะทำการเว้นวรรคหรือไม่เว้นวรรคระหว่างชื่อของตัวแปรกับค่าที่กำหนดเพื่อให้ง่ายต่อการการอ่านหรือไม่ก็ได้ และเมื่อกำหนดค่าให้ตัวแปรแล้วภาษาอาร์จะไม่แสดงค่าออกมาทางหน้าจอให้เห็น ถ้าต้องการเห็นค่าทางหน้าก็สามารถพิมพ์เรียกตัวแปรนั้นขึ้นมาได้เลย ดังนี้

Age   
## [1] 14 14 15 16 20
Salary
## [1] 30000 25000 50000
Student.Birthday 
## [1] "2011-06-28" "2012-12-15"

ถ้าโปรแกรม RStudio ตัวแปรที่เราสร้างขึ้น จะแปรขึ้นที่หน้าต่าง ดังตัวอย่างนี้ หน้าต่างแสดงตัวแปรในโปรแกรม RStudio

การตั้งชื่อตัวแปรที่ดีนั้นควรตั้งชื่อให้สื่อความหมายไม่ควรสั้นหรือยาวเกินไป เพราะการเขียนโปรแกรมที่ดีนั้นนอกจากจะให้คอมพิวเตอร์เข้าใจแล้ว จำเป็นต้องให้ผู้อื่นที่ไม่ใช่ผู้เขียนสามารถเข้าใจได้ด้วย สิ่งสำคัญอีกเรื่องหนึ่งก็การเขียนข้อความกำกับเพื่อบอกว่า เราต้องการทำอะไรในโปรแกรมนี้ ในแต่ส่วนงาน โดยใช้ เครื่องหมาย # วางไว้ข้างหน้า และทุกสิ่งที่เราพิมพ์ต่อท้ายเครื่องหมาย # ในบรรทัดนี้ภาษาอาร์จะไม่ทำการประมวลผลและข้ามไปอ่านในบรรทัดต่อไปแทน เช่น

# Age คืออายุของนักเรียน
Age   <- c(14,14,15,16,20)  
Age
## [1] 14 14 15 16 20
Salary= c(30000,  # เงินเดือน
          25000,  # เงินรายได้พิเศษ
          50000)  # เงินโบนัสประจำปี
Salary
## [1] 30000 25000 50000

การเรียกใช้ค่าตัวแปรเวคเตอร์

จากตัวอย่างถ้าต้องการเขียนใช้ค่าเวคเตอร์ Age ตำแหน่งที่ 1 สามารถใช้คำสั่ง Age[1] ถ้าต้องการเรียกใช้หลายค่า ให้สร้างเวคเตอร์ตำแหน่งขึ้นมาก่อนดังตัวอย่างต่อไปนี้

Age
## [1] 14 14 15 16 20
Age[1] # เรียกใช้ค่าเวคเตอร์ตำแหน่งที่ 1
## [1] 14
Age[c(1)] # เรียกใช้ค่าเวคเตอร์ตำแหน่งที่ 1 อีกวิธี
## [1] 14
Age[c(1,4)] # เรียกใช้ค่าเวคเตอร์ตำแหน่งที่ 1 และ 4
## [1] 14 16
Age[c(4,1,3)] # เรียกใช้ค่าเวคเตอร์ตำแหน่งที่ 4 1 และ 3
## [1] 16 14 15
# สร้างเวคเตอร์ position 
position <- c(4,1,3)
Age[position] # ใช้อีกตัวแปรในการเรียกค่าที่ต้องการ
## [1] 16 14 15

การเปลี่ยนค่าภายในของตัวแปรเวคเตอร์

จากเวคเตอร์ที่มีอยู่แล้ว ถ้าเราต้องการเปลี่ยนค่าในตำแหน่งที่ต้องการ เช่นให้

# สร้างเวคเตอร์  X ที่เก็บค่าตัวเลข 1 ถึง 5
X <- 1:5
X
## [1] 1 2 3 4 5

ถ้าต้องการเปลียนค่าของ \(X[3]\) ให้มีค่าเท่ากับ 8 ก็ทำได้โดยง่ายดังนี้

# กำหนดให้ตัวแปรเวตเตอร์ X ตำแหน่งที่ 3 มีค่าเท่ากับ 8
X[3] <- 8
# แสดงค่าตัวแปร X มีค่าเท่ากับ 3
X[3]
## [1] 8

ตัวอย่างต่อมา ถ้าต้องการให้เวคเตอร์ \(X\) ที่ตำแหน่งที่ 1 และ 5 มีค่าเท่ากับ 12 และ 9 ก็ทำแบบเดียวกัน

X[c(1,5)] <- c(12,9)
X
## [1] 12  2  8  4  9

คำสั่งในเวคเตอร์

การนับจำนวนสมาชิกที่ซ้ำกันในเวกเตอร์ สามารถใช้คำสั่ง table เช่น

A <- c(1:3,2:3,1,1,1)
A 
## [1] 1 2 3 2 3 1 1 1
table(A) # ดูว่าในเวคเตอร์ A สมาชิกอะไรบ้างและมีจำนวนเท่าไหร่
## A
## 1 2 3 
## 4 2 2

จะเห็นได้ว่า ในเวคเตอร์ มี 1อยู่ 4 ตัว 2 และ 3 อย่างละ 2 ตัว ถ้าต้องการดูว่าใน เวคเตอร์นี้มีสมาชิกอะไรบ้าง โดยไม่นับค่าที่มีซ้ำกันให้ใช้คำสั่งคำสั่ง unique()

unique(A)
## [1] 1 2 3
B <- c(1:5,2:6,3:6)
unique(B)
## [1] 1 2 3 4 5 6

การเรียงลำดับในเวตเตอร์

ให้ใช้คำสั่ง sort()

sort(A)
## [1] 1 1 1 1 2 2 3 3

จากตัวอย่างจะเห็นได้ว่าเป็นเรียงลำดับจากน้อยไปมาก ถ้าต้องการให้เรียงลำดับจาก มากไปน้อยให้ใช้คำสั่งดังนี้

sort(A,decreasing = TRUE)
## [1] 3 3 2 2 1 1 1 1

ถ้าต้องให้การให้สลับค่า vector จากขวาไปซ้ายให้ใช้คำสั่ง rev()

A
## [1] 1 2 3 2 3 1 1 1
rev(A)
## [1] 1 1 1 3 2 3 2 1

การรวมกันของตัวแปรเวคเตอร์

ทำได้โดยง่ายดังนี้ เช่นตัวอย่างต่อไปนี้

# สร้างเวคเตอร์ 1 ถึง 10 โดยตั้งชื่อตัวแปรว่า A1
A1 <- 1:10
# สร้างเวคเตอร์ 50 ถึง 60 โดยตั้งชื่อตัวแปรว่า A2
A2 <- 50:60

สามารถนำตัวแปร A1 และ A2 มารวมกันเป็นตัวแปรใหม่ คือ A3 ได้ดังนี้

# รวมเวคเตอร์ A1 กับ A2 ดัวยตัวแปรตัวชื่อ A3
A3 <-c(A1,A2)
# แสดงค่าเวคเตอร์ A3
A3
##  [1]  1  2  3  4  5  6  7  8  9 10 50 51 52 53 54 55 56 57 58 59 60

ข้อมูลแบบเมทริกซ์(matrix)

ข้อมูลแบบเมทริกซ์ คือข้อมูลแบบเวคเตอร์ 2 มิติที่มีจำนวนแถว(row)เท่ากับ \(N\) และจำนวนสดมภ์(column)เท่ากับ \(M\) และมีจำนวนข้อมูลภายในเมทริกซ์เท่ากับ \(N \times M\) โดยข้อมูลแบบเมทริกซ์นี้จะเก็บข้อมูลประเภทเดียวกันทั้งหมด เช่น เมทริกซ์จำนวน เมทริกซ์ตัวอักษร หรือเมทริกซ์ตรรกศาสตร์เป็นต้น โดยการสร้างเมทริกซ์นั้น จสร้างจากเวคเตอร์ X ที่จำนวนเท่ากับข้อมูลเท่ากับ \(N \times M\) ก่อนแล้วจึงใช้ คำสั่ง matrix(X,nrow=N) หรือ matrix(X,ncol=M) สร้างเมทริกซ์ขึ้นมาดังนี้่

N <- 3  # จำนวนแถว(row)
M <- 3  # จำนวนสดมภ์(column)
X <- rep(c(1,2,3),N*M) #สร้างเวคเตอร์ (1,2,3)ต่อกันเท่ากับ N คูณ M
X  
##  [1] 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3
# สร้างเมตริกซ์ ชื่อ matrix.X1 จากเวคเตอร์ X โดยใช้ คำสั่ง nrow เป็นการกำหนดจำนวนแถว
matrix.X1 <- matrix(X,nrow=N) 
matrix.X1
##      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
## [1,]    1    1    1    1    1    1    1    1    1
## [2,]    2    2    2    2    2    2    2    2    2
## [3,]    3    3    3    3    3    3    3    3    3
# สร้างเมตริกซ์ ชื่อ matrix.X2 จากเวคเตอร์ X โดยใช้ คำสั่ง ncol เป็นการกำหนดจำนวนสดมภ์
matrix.X2 <- matrix(X,ncol=M) 
matrix.X2
##       [,1] [,2] [,3]
##  [1,]    1    1    1
##  [2,]    2    2    2
##  [3,]    3    3    3
##  [4,]    1    1    1
##  [5,]    2    2    2
##  [6,]    3    3    3
##  [7,]    1    1    1
##  [8,]    2    2    2
##  [9,]    3    3    3

matrix.X1 ถูกสร้างโดยใช้จำนวนแถวเท่ากับ 3 matrix.X2 ถูกสร้างโดยใช้จำนวนสดมภ์เท่ากับ 3 ให้ผู้อ่านลองพิจารณาว่า จากเวคเตอร์ X ไปสู่เมทริกซ์ matrix.X1 และ matrix.X2 ต่างกันอย่างไร

การเรียกใช้งานค่าภายในเมตริกซ์

จากตัวอย่าง matrix.X1 เราสามารถเรียกใช้ค่าในเมตริกซ์ matrix.X1 โคยใช้คำสัั่ง matrix.X1[u,v] โดยที่ u และ v คือเวคเตอร์ของตำแหน่งที่ต้องการ

matrix.X1[2,3]  
## [1] 2
matrix.X1[c(2,3),c(3,5,6)]
##      [,1] [,2] [,3]
## [1,]    2    2    2
## [2,]    3    3    3
matrix.X1[1,]
## [1] 1 1 1 1 1 1 1 1 1
matrix.X1[,2]
## [1] 1 2 3

ข้อสังเกตุ matrix.X1[2,3] เป็นเวคเตอร์ขนาด 1 หรือเมทริกซ์ขนาด \(1\times 1\) ส่วน matrix.X1[c(2,3),c(3,5,6)] เป็นเมทริกซ์ขนาด \(2\times 3\) แต่สำหรับ matrix.X1[1,] เป็นเวคเตอร์ขนาด 9 จากเมทริกซ์ matrix.X1 ในแถวที่ 1 ทั้งหมด ส่วน matrix.X1[,2] เป็นเวคเตอร์ขนาด 3 จากเมทริกซ์ matrix.X1 ในสดมภ์ที่ 2 ทั้งหมด

คำสั่งสำหรับหารค่าขนาดของแถว สดมภ์ หรือ ขนาดมิติของตัวแปรเมตริกซ์

สามารถใช่คำสั่ง ดังต่อไปนี้คือ

  • nrow() คือจำนวนแถว

  • ncol() คือจำนวนสดมภ์

  • dim() คือเวคเตอร์แสดงขนาดของแถวและสดมภ์ตามลำดับ

X<-matrix(1:10,nrow=2)
nrow(X)
## [1] 2
ncol(X)
## [1] 5
 dim(X)
## [1] 2 5

เราสามารถใช้คำสั่ง dim()[1]แทน nrow() และ dim()[2] แทน ncol() ได้

dim(X)[1]
## [1] 2
dim(X)[2]
## [1] 5

การเพิ่มข้อมูลลงไปในตัวแปรเมตริกซ์

การเพิ่มข้อมูลลงในตัวแปรเมตริกซ์เพิ่มได้ 2 วิธีคือ เพิ่มจำนวนแถว หรือเพิ่มจำนวนหลัก ถ้าต้องการเพิ่มจำนวน แถวให้ใช้ คำสั่ง rbind()โดยค่าที่ต้องการเพิ่มต้องเป็นเวคเตอร์ที่ขนาดเท่ากับจำนวนสดมภ์ หรือ เป็นตัวแปรเมตริกซ์ที่ขนาดสดมภ์เท่ากัน ดังตัวอย่างต่อไปนี้

X
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    1    3    5    7    9
## [2,]    2    4    6    8   10
# rbind คือการเมตริกซ์ที่ขนาดสดมภ์เท่ากันมาต่อกันที่แถว
X<-rbind(X,11:15)
X
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    1    3    5    7    9
## [2,]    2    4    6    8   10
## [3,]   11   12   13   14   15
X<-rbind(X,matrix(1:10,ncol=5))
X
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    1    3    5    7    9
## [2,]    2    4    6    8   10
## [3,]   11   12   13   14   15
## [4,]    1    3    5    7    9
## [5,]    2    4    6    8   10

สำหรับการเพิ่มจำนวนสดมภ์ก็ เหมือนกับการเพิ่มจำนวนหลัก แตกต่างกันที่ถ้าต้องการเพิ่มจำนวนสดมภ์ ถ้าเป็นข้อมูลเวคเตอร์ ต้องมีขนาดเท่ากับจำนวนแถว หรือเป็นเมตริกซ์ที่มีจำนวนแถวเท่ากันโดยใช้คำสั่ง cbind( )

Y<-matrix(1:4,ncol=2)
Y
##      [,1] [,2]
## [1,]    1    3
## [2,]    2    4
# rbind คือการเมตริกซ์ที่ขนาดสดมภ์เท่ากันมาต่อกันที่สดมภ์
Y<-cbind(Y,5:6)
Y
##      [,1] [,2] [,3]
## [1,]    1    3    5
## [2,]    2    4    6
Y<-cbind(Y,matrix(7:10,ncol=2))
Y
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    1    3    5    7    9
## [2,]    2    4    6    8   10

ข้อมูลแบบกรอบข้อมูล(data frame)

ข้อมูลแบบกรอบข้อมูล คือการเก็บข้อมูลแบบเมทริกซ์ที่มีขนาด \(N\times M\) และในเมทริกซ์นี้จะมีข้อมูลแบบใดก็ได้ และมีการบังคับให้ตั้งชื่อแก่สดมภ์ทุกสดมภ์ และข้อมูลในแต่ละสดมภ์ต้องเป็นข้อมูลประเภทเดียวกันเท่านั้น เช่น เช่นข้อมูลของนักเรียนสามคนที่ประกอบด้วยชื่อ Aom Nicha และ Bua อายุ 12 13 และ 12 และเงินไปโรงเรียนต่อวัน 50 45 60 บาทตามลำดับ สามารถสร้างเป็นกรอบข้อมูลได้ดังนี้

student<-data.frame(  name = c("Aom","Nicha","Bua"), # ชื่อ
                       age = c(12, 13 ,12 ), # อายุ
                     money = c(50,45,60)  # เงินไปโรงเรียน
                     ) 
student    
##    name age money
## 1   Aom  12    50
## 2 Nicha  13    45
## 3   Bua  12    60
# str() คือคำสั่งดูข้อมูลภายในกรอบข้อมูลเบื้องต้น
str(student) 
## 'data.frame':    3 obs. of  3 variables:
##  $ name : chr  "Aom" "Nicha" "Bua"
##  $ age  : num  12 13 12
##  $ money: num  50 45 60

ถ้าไม่ตั้งชื่อตัวแปรในหลักสดมภ์ โปรแกรมอาร์จะตั้งชื่อให้อัตโนมัติดังนี้

student<-data.frame(c("Aom","Nicha","Bua"),
                    c(12, 13 ,12 ),
                    c(50,45,60))
str(student)                   
## 'data.frame':    3 obs. of  3 variables:
##  $ c..Aom....Nicha....Bua..: chr  "Aom" "Nicha" "Bua"
##  $ c.12..13..12.           : num  12 13 12
##  $ c.50..45..60.           : num  50 45 60

คำสั่ง str() เป็นการแสดงค่าชนิดของตัวแปรและค่าภายในของแต่ละสดมภ์ของกรอบข้อมูลว่า มีจำนวนตัวแปรเและจำนวนข้อมูลเท่าไหร่ และเป็นข้อมูลชนิดใดบ้าง

ข้อสังเกตุ สำหรับสดมภ์ที่สร้างขึ้นจากเวคเตอร์ของตัวอักษร จะถูกกำหนดให้เป็นเวคเตอร์ของข้อมูลชนิดใหม่ คือข้อมูลแบบ factor ก็คือข้อมูลแบบตัวอักษร ที่สามารถกำหนดให้มีลำดับหรือสามารถเปรียบเทียบกันได้ ซึ่งใช้มากในทางสังคมศาสตร์ ซึ่งจะพูดถึงในภายหลัง ดังนั้นถ้าต้องการให้เวคเตอร์อักษรยังคงเป็นอักษรอยู่สามารถใช้คำสั่งนี้ as.character() ช่วยสำหรับตัวแปรชนิดตัวอักษรบางตัวที่ไม่ต้องการเปลี่ยนให้เป็นตัวแปร factor หรือกำหนดเงื่อนไขใน คำสั่ง data.frame ดังนี้ stringsAsFactors = FALSE จะทำให้ตัวแปรที่เป็นชนิดตัวอักษรทั้งหมด จะไม่ถูกเปลี่ยนไปเป็น factor

student<-data.frame(  name = c("Aom","Nicha","Bua"),
                       age = c(12, 13 ,12 ),
                     money = c(50,45,60))
student$name <- as.character(student$name)      
str(student)
## 'data.frame':    3 obs. of  3 variables:
##  $ name : chr  "Aom" "Nicha" "Bua"
##  $ age  : num  12 13 12
##  $ money: num  50 45 60

หรือจะใช้คำสั่ง stringAsFactor = FALSE ตอนสร้างกรอบข้อมูลเลยก็ได้

student<-data.frame(  name = c("Aom","Nicha","Bua"),
                       age = c(12, 13 ,12 ),
                     money = c(50,45,60),
                     stringsAsFactors = FALSE)
str(student)  
## 'data.frame':    3 obs. of  3 variables:
##  $ name : chr  "Aom" "Nicha" "Bua"
##  $ age  : num  12 13 12
##  $ money: num  50 45 60

การเรียกใช้ข้อมูลในกรอบข้อมูล สามารถทำได้เหมือนกับข้อมูลแบบเมทริกซ์ แต่สำหรับการเรียกใช้ค่าตัวแปรในกรอบข้อมูลให้ ใส่เครื่องหมาย $ ต่อจากตัวแปรกรอบข้อมูล แล้วตามชื่อเรียกตัวแปรในสดมภ์ ที่ต้องการ เช่น

# แสดงข้อมูลแถวที่ 1 ทุกค่าตัวแปร
student [1,]
##   name age money
## 1  Aom  12    50
# แสดงข้อมูลตัวแปร age ทั้งหมด
student[,2]
## [1] 12 13 12
# แสดงข้อมูลแถวที่ 1 และ 2 สดมภ์ที่ 2 และ 3
student[c(1,2),c(2,3)]
##   age money
## 1  12    50
## 2  13    45
# แสดงข้อมูลตัวแปร name ทั้งหมด
student$name
## [1] "Aom"   "Nicha" "Bua"
# แสดงข้อมูลตัวแปร money ทั้งหมด
student$money
## [1] 50 45 60

ถ้าต้องการใช้ข้อมูลบางตัวในตัวแปรสดมภ์ของกรอบข้อมูลก็ทำได้ดังนี้

# แสดงข้อมูลตัวแปร name ตัวที่ 1 และ 3
student$name[c(1,3)]
## [1] "Aom" "Bua"
# แสดงข้อมูลตัวแปร money ตัวที่ 2 และ 3
student$money[c(2,3)]
## [1] 45 60

ในงานทางด้านสถิตินั้น การเก็บข้อมูลและเรียกใช้งาน ควรใช้ข้อมูลแบบกรอบข้อมูลเพราะจะช่วยให้การทำงานต่างๆ ง่ายขึ้น สำหรับการเพิ่มจำนวนตัวแปร หรือต้องลบข้อมูลบางแถวหรือบางหลักออกก็สามารถทำได้ดังนี้ สมมุติมีข้อมูลเพิ่มว่า นักเรียนแต่คนใช้เงินเท่าไหร่ เช่น 20 30 และ 40 บาทตามลำดับ ถ้าอยากทราบจะเหลือเงินเท่าไหร่ก็สามารถทำได้ โดย ให้ expense แทนตัวแปรรายจ่าย ให้ balance แทนจำนวนเงินคงเหลือ

student$expense <-c(20,30,40)
student$balance <-student$money-student$expense
student
##    name age money expense balance
## 1   Aom  12    50      20      30
## 2 Nicha  13    45      30      15
## 3   Bua  12    60      40      20

ส่วนการลบตัวแปรออกนั้นสามารถทำได้โดยดังนี้ ถ้าต้องการลบตัวแปร balance ออก

student$balance <- NULL
student
##    name age money expense
## 1   Aom  12    50      20
## 2 Nicha  13    45      30
## 3   Bua  12    60      40

การเพิ่มข้อมูลสามารถทำได้ดังนี้ ถ้ามีข้อมูลชุดใหม่ดังนี้คือ นักเรียนชื่อ Mod อายุ 14 ปี ได้รับเงินมาโรงเรียน 55 บาทแล้วใช้ไป 25 บาท

student[4,] <-c("Mod",14,55,25)
student
##    name age money expense
## 1   Aom  12    50      20
## 2 Nicha  13    45      30
## 3   Bua  12    60      40
## 4   Mod  14    55      25

หรืออีกใช้คำสั่ง rbind() ถ้าข้อมูลอีกชุดเป็นดังนี้ นักเรียนชื่อ Keaw อายุ 13 ปี ได้รับเงินมาโรงเรียน 65 บาทแล้วใช้ไป 35 บาท

student <-rbind(student,c("Keaw",13,65,35))
student
##    name age money expense
## 1   Aom  12    50      20
## 2 Nicha  13    45      30
## 3   Bua  12    60      40
## 4   Mod  14    55      25
## 5  Keaw  13    65      35

การลบข้อมูลบางแถวก็สามารถทำได้ เช่นถ้าทราบนักเรียนคนแรก ข้อมูลไม่เป็นความจริงและต้องการลบออก ทำได้ดังนี้

student <- student[-c(1),]
student
##    name age money expense
## 2 Nicha  13    45      30
## 3   Bua  12    60      40
## 4   Mod  14    55      25
## 5  Keaw  13    65      35

เป็นคำสั่งลบค่าที่ไม่ต้องการแล้วกำหนดให้กับตัวแปรตัวเดิม

พิจารณาค่าของตัวแปรที่เกิดขึ้น

str(student)
## 'data.frame':    4 obs. of  4 variables:
##  $ name   : chr  "Nicha" "Bua" "Mod" "Keaw"
##  $ age    : chr  "13" "12" "14" "13"
##  $ money  : chr  "45" "60" "55" "65"
##  $ expense: chr  "30" "40" "25" "35"

จะเห็นว่าตัวแปร age money และ expense ภายในกรอบข้อมูล student เปลี่ยนตัวอักษรทั้งหมด เพราะ การกำหนดค่าในแถวใหม่ เกิดจากเวคเตอร์ตัวษร เช่น

str(c("Mod",14,55,25))
##  chr [1:4] "Mod" "14" "55" "25"

ดังนี้ ทางแก้ทำได้สองทาง คือ ใช้ สร้างกรอบข้อมูลที่มีตัวแปรจำนวนเท่ากันขึ้นมา หรือ กำหนดค่าขนิดของข้อมูลที่ถูกต้องให้ตัวแปรถายในกรอบข้อมูลอีกครั้ง

student$age<-as.numeric(student$age)
student$money<-as.numeric(student$money)
student$expense<-as.numeric(student$expense)
str(student)
## 'data.frame':    4 obs. of  4 variables:
##  $ name   : chr  "Nicha" "Bua" "Mod" "Keaw"
##  $ age    : num  13 12 14 13
##  $ money  : num  45 60 55 65
##  $ expense: num  30 40 25 35

หรือ

new_data<-data.frame(name ="Pang",age=14,money=50,expense=40)
student<-rbind(student,new_data)
str(student)
## 'data.frame':    5 obs. of  4 variables:
##  $ name   : chr  "Nicha" "Bua" "Mod" "Keaw" ...
##  $ age    : num  13 12 14 13 14
##  $ money  : num  45 60 55 65 50
##  $ expense: num  30 40 25 35 40

คำสั่งที่เกี่ยวข้องกับการแสดงจำนวนตัวแปรและลบตัวแปรที่ไม่ต้องการออกไป

คำสั่ง ls() คือให้แสดงตัวแปรทั้งหมดในปัจจุบัน

ls()
##  [1] "A"                "A1"               "A2"               "A3"              
##  [5] "Age"              "B"                "M"                "matrix.X1"       
##  [9] "matrix.X2"        "N"                "new_data"         "position"        
## [13] "Salary"           "sex3"             "student"          "Student.Birthday"
## [17] "Test_result"      "X"                "Y"

ถ้าต้องลบตัวแปรบางตัวออกไป ให้ใช้คำสั่ง rm() ถ้าต้องหารลบ ออกหนึ่งตัว

rm(A)
ls()
##  [1] "A1"               "A2"               "A3"               "Age"             
##  [5] "B"                "M"                "matrix.X1"        "matrix.X2"       
##  [9] "N"                "new_data"         "position"         "Salary"          
## [13] "sex3"             "student"          "Student.Birthday" "Test_result"     
## [17] "X"                "Y"

จะเห็นว่าตัวแปร A ถูกลบออกไป ถ้าต้องการลบตัวแปรมากกว่าหนึ่งตัวขึ้นไป ให้ใส่ชื่อแปรที่ต้องการ ลงไปโดยใช้เครื่องหมาย , คั่นระหว่างตัวแปรเช่น

rm(Age,B)
ls()
##  [1] "A1"               "A2"               "A3"               "M"               
##  [5] "matrix.X1"        "matrix.X2"        "N"                "new_data"        
##  [9] "position"         "Salary"           "sex3"             "student"         
## [13] "Student.Birthday" "Test_result"      "X"                "Y"

ถ้าต้องการลบตัวแปรทั้งหมดออกจากระบบ สามารถทำได้โดยใช้ตำสั่ง

rm(list = ls())

ตัวแปรอีกชนิดที่ไม่ได้กล่าวถึงในหนังสือเล่มนี้ คือตัวแปร ประเภท list เป็นตัวแปรชนิดที่เป็นทั่วไปกว่ากรอบข้อมูล ก็คือ ข้อมูลที่อยู่ในตัวแปร list นี้ในแถวและสดมภ์ อาจจะเป็นตัวแปร ชนิดเวคเตอร์ตั้งแต่ 1 ตำแหน่งขึ้นไป หรือ เป็นเมตริกซ์ หรือเป็นกรอบข้อมูลก็ได้ การเรียกใช้ก็จะความสับซ้อนเพิ่มขึ้น แต่สำหรับการทำงานโดยทั่วไป ข้อมูลชนิดกรอบข้อมูลก็เพียงพอแล้ว จึงขอไม่กล่าวถึง

สำหรับคำสั่งอื่นๆ จะทยอยแทรกตามเนื้อหาในบทต่อๆ ไป ในหนังสือนี้จะกล่าวถึงเฉพาะเนื้อหาที่สำคัญที่นศ. นิสิตและผู้สนใจควรรู้ในคำสั่งเบื้องต้นที่จำเป็นเพื่อ มิให้หนังสือมีความหนาเกินมากไป ถ้าผู้อ่านมีความเข้าหลักการเบื้องต้นมากเป็นอย่างดีแล้ว ก็สามารถค้นหาคำสั่งต่างๆ อินเตอร์เน๊ตได้ด้วยตนเอง

## บทอื่นๆ