ภาษาอาร์เป็นภาษาทางคอมพิวเตอร์แบบหนึ่งที่ถูกสร้างขึ้นมาเพื่อประยุกต์ใช้ในทางสถิติไม่ว่าจะการคำนวณค่าสถิติต่างๆ เช่น ค่าเฉลี่ย ความความแปรปรวน การทดสอบสมมุติฐาน หรือการพยากรณ์ทั้งทางวิทยาศาสตร์ สังคมศาสตร์ เศรษฐศาสตร์ และด้านอื่นๆ อีกมากมาย ภาษาอาร์เป็นภาษาที่ใช้นำมางานได้ฟรีไม่เสียค่าลิขสิทธิ์ และมีพัฒนาปรับปรุงตลอดเวลา และเป็นภาษาที่สามารถศึกษาหาความรู้จากแหล่งต่างๆได้ง่าย เนื่องเป็นภาษาทางคอมพิวเตอร์ที่ได้รับความนิยมมากในปัจจุบันเช่น
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"
เวคเตอร์เป็นข้อมูลที่ถูกเก็บหรือสร้างตั้งแต่ 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
จะเป็นข้อมูลชนิดใด ให้ผู้อ่านทดลองทำดู
ในกรณีที่ต้องสร้างลำดับจำนวนเต็มที่เพิ่มขึ้นทีละ 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 ตัวแปรที่เราสร้างขึ้น จะแปรขึ้นที่หน้าต่าง ดังตัวอย่างนี้
การตั้งชื่อตัวแปรที่ดีนั้นควรตั้งชื่อให้สื่อความหมายไม่ควรสั้นหรือยาวเกินไป เพราะการเขียนโปรแกรมที่ดีนั้นนอกจากจะให้คอมพิวเตอร์เข้าใจแล้ว จำเป็นต้องให้ผู้อื่นที่ไม่ใช่ผู้เขียนสามารถเข้าใจได้ด้วย สิ่งสำคัญอีกเรื่องหนึ่งก็การเขียนข้อความกำกับเพื่อบอกว่า เราต้องการทำอะไรในโปรแกรมนี้ ในแต่ส่วนงาน โดยใช้ เครื่องหมาย # วางไว้ข้างหน้า และทุกสิ่งที่เราพิมพ์ต่อท้ายเครื่องหมาย # ในบรรทัดนี้ภาษาอาร์จะไม่ทำการประมวลผลและข้ามไปอ่านในบรรทัดต่อไปแทน เช่น
# 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
ข้อมูลแบบเมทริกซ์ คือข้อมูลแบบเวคเตอร์ 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
ข้อมูลแบบกรอบข้อมูล คือการเก็บข้อมูลแบบเมทริกซ์ที่มีขนาด \(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 ตำแหน่งขึ้นไป หรือ เป็นเมตริกซ์ หรือเป็นกรอบข้อมูลก็ได้ การเรียกใช้ก็จะความสับซ้อนเพิ่มขึ้น แต่สำหรับการทำงานโดยทั่วไป ข้อมูลชนิดกรอบข้อมูลก็เพียงพอแล้ว จึงขอไม่กล่าวถึง
สำหรับคำสั่งอื่นๆ จะทยอยแทรกตามเนื้อหาในบทต่อๆ ไป ในหนังสือนี้จะกล่าวถึงเฉพาะเนื้อหาที่สำคัญที่นศ. นิสิตและผู้สนใจควรรู้ในคำสั่งเบื้องต้นที่จำเป็นเพื่อ มิให้หนังสือมีความหนาเกินมากไป ถ้าผู้อ่านมีความเข้าหลักการเบื้องต้นมากเป็นอย่างดีแล้ว ก็สามารถค้นหาคำสั่งต่างๆ อินเตอร์เน๊ตได้ด้วยตนเอง
## บทอื่นๆ