3  ภาษาอาร์พื้นฐาน (Basic R Programming)

หลักการที่สำคัญของภาษาอาร์ ที่ควรสังเกตุและจดจำคือ ว่าตัวแปรต่างๆในอาร์นั้น เป็นวัตถุ(object) หรือฟังก์ชัน(function)?

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

letters
 [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s"
[20] "t" "u" "v" "w" "x" "y" "z"

หรือ

letters[1:5]
[1] "a" "b" "c" "d" "e"

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

ถ้าเรียกใช้ฟังก์ชันโดยไม่ใส่วงเล็บ ( ) จะได้ผลดังตัวอย่างต่อไปนี้

mean
function (x, ...) 
UseMethod("mean")
<bytecode: 0x7ff2c2160f60>
<environment: namespace:base>

จะเห็นว่า ไม่สามารถใช้งานได้ หรือแสดงผลลัพธ์ตามที่ต้องการ

mean(x = 1:5)
[1] 3

ตัวอย่างฟังก์ชันที่ไม่จำเป็นต้องใส่ค่าภายใน ก็คือ

install_tinytex( )
# จะเรียกใช้งานได้ ก็ต่อเมื่อเรียกใช้คำสั่ง library(tinytex) แล้วเท่านั้น

3.1 ประเภทของข้อมูลในภาษาอาร์

ในภาษาอาร์ค่าตัวแปรทุกชนิด ถูกมองเป็นวัตถุ (object) โดยวัตถุที่มีขนาดเล็กที่สุด(มีค่าเดียว) คือตัวแปรประเภท

ชนิดของตัวแปรต่างๆ ในอาร์
  • ตัวเลขจำนวนจริง (numeric หรือ double)

  • จำนวนนับ (integer)

  • จำนวนเชิงซ้อน (complex)

  • ค่าตรรกศาสตร์ (logical)

  • ตัวอักษร (character)

  • ข้อมูลกลุ่ม (factor)

ตัวอย่าง

3.5  # numeric
3L   # integer
10+2i # complex
TRUE  # logical
"Somsak Chanaim" # character

3.2 การตรวจสอบชนิดของข้อมูล

เราสามารถตรวจสอบชนิดของวัตถุในอาร์ ได้ด้วยใช้คำสั่งดังต่อไปนี้

  • typeof( )

  • mode( )

  • storage.mode( )

  • class( )

  • str( )

typeof(2)
[1] "double"
class(2L)
[1] "integer"
storage.mode("3")
[1] "character"
mode(TRUE)
[1] "logical"
str(T)
 logi TRUE

ตารางต่อไปนี้แสดงความแตกต่างที่เป็นไปได้ ของผลลัพธ์เมื่อใช้ฟังก์ชัน typeof( ) , storage.mode( ) และ mode( ) ในการตรวจสอบวัตถุ

typeof storage.mode mode
logical logical logical
integer numeric integer
double numeric double
complex complex complex
character character character

ในการตรวจสอบวัตถุ บ้างครั้งเราต้องทราบว่า วัตถุนี้เป็น ตัวเลขหรือไม่? ผลลัพธ์ที่ได้จากตรวจสอบจะเป็นค่าทางตรรกศาสตร์ ทีให้ค่าออกมาเป็นจริง (TRUE หรือ T) หรือเท็จ (FALSE หรือ F)

โดยมีวิธีการจำคำสั่งแบบง่ายๆ คือ การตรวจสอบวัตถุว่าใช่หรือไม่ใช่ จะเริ่มต้นด้วย is. และตามประเภทหรือชนิดของวัตถุ เช่น

  • is.character( )

  • is.numeric( )

  • is.logical( )

  • is.complex( )

  • is.factor( )

เป็นต้น

3.3 ข้อมูลชนิดตัวเลข

ข้อมูลตัวเลขในอาร์ เป็นไปได้ทั้งด้วยข้อมูลประเภทจำนวนจริง จำนวนเต็ม เราสามารถตรวจสอบว่าวัตถุเป็นตัวเลขด้วยฟังก์ชัน mode( ) หรือตรวจสอบว่าเป็นตัวเลขใช่หรือไม่ด้วย is.numeric( ) หรือ is.double( )

mode(55)
[1] "numeric"
is.numeric(55) 
[1] TRUE
is.double(55)
[1] TRUE

ตัวแปรชนิดพิเศษที่ถือว่าเป็นตัวเลข คือ

  • Inf, -Inf คือ ค่าอนันต์ (infinity) ในทางคณิตศาสตร์

  • NaN มาจาก Not a Number

คำว่า Inf และ NaN เป็นตัวอักษรที่ไม่สามารถใช้ในการตั้งตัวแปรได้ หรือเป็นคำสงวน (reserve words)

typeof(Inf) 
[1] "double"
typeof(-Inf) 
[1] "double"
typeof(NaN)  # "double"
[1] "double"
is.numeric(Inf)
[1] TRUE
is.double(NaN)
[1] TRUE

3.4 วัตถุ/ข้อมูลประเภทจำนวนเต็ม (interger)

ในการสร้างตัวแปรประเภทจำนวนเต็ม ให้เลขตัวเลขจำนวนเต็มที่ต้องการและต่อด้วยเครื่องหมาย L เช่น

1L
[1] 1
100L
[1] 100

ในการตรวจว่าวัตถุเป็นจำนวนเต็มหรือไม่? ให้ใช้คำสั่ง is.interger( )

ตัวอย่าง

is.integer(5)
[1] FALSE
is.integer(5L)
[1] TRUE

ในภาษาอาร์ จำนวนเต็ม (integer) เป็นข้อมูลชนิดตัวเลข (numeric) แต่ข้อมูลชนิดตัวเลขไม่จำเป็นต้องเป็นจำนวนเต็ม

is.numeric(5L)
[1] TRUE

3.5 ข้อมูลชนิดตรรกศาสตร์ (logical)

ค่าตรรกศาสตร์ในอาร์มี 3 ค่า คือ

  • TRUE

  • FALSE

  • NA มาจาก “Not Available” หรือ “Missing Value”

typeof(TRUE)  # "logical"
[1] "logical"
typeof(FALSE)  # "logical"
[1] "logical"
typeof(NA)  # "logical"
[1] "logical"

สำหรับภาษาอาร์ค่า TRUE สามารถเขียนโดยย่อโดยใช้ T และค่า FALSE สามารถเขียนโดยย่อโดยใช้ F

typeof(T) 
[1] "logical"
typeof(F)
[1] "logical"

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

a <- T
is.logical(a)
[1] TRUE
F <- 2
is.logical(F)
[1] FALSE

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

FALSE <- 2 
Error in FALSE <- 2: invalid (do_set) left-hand side to assignment

3.6 ข้อมูลจำนวนเชิงซ้อน (complex number)

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

\[a+bi\] โดยที่ a และ b เป็นจำนวนจริง และ i หมายถึงค่า \(\sqrt{-1}\)

ในภาษาอาร์สร้างได้ดังตัวอย่างต่อไปนี้

2 + 3i
[1] 2+3i
1.5 + 3.2i
[1] 1.5+3.2i
2L + 3i
[1] 2+3i

และสามารถตรวจสอบว่า วัตถุเป็นจำนวนเชิงซ้อนหรือไม่ได้โดยคำสั่ง is.complex( )

is.complex(2 + 3i) # TRUE
[1] TRUE

โดยปกติแล้ว ตัวเลขจำนวนจินตภาพไม่ได้ค่อยได้ถูกใช้งาน ยกเว้นในงานทางคณิตศาสตร์และทางวิศวะกรรม

3.7 ข้อมูลชนิดตัวอักษร (character)

เราสามารถสร้างวัตถุหรือข้อมูลตัวอักษร โดยใช้ภาษาหรือตัวเลขใดๆ ขึ้นมาก็ได้ โดยต้องอยู่ในเครื่องหมายคำพูด \("\) \("\)

เป้าหมายของข้อมูลประเภทคือ ก็คือการจัดกลุ่มโดยไม่ต้องสนใจลำดับก่อนหลัง เช่น ชื่อสัตว์บก กระทรวงต่างๆ ในประเทศไทย จังหวัดในประเทศไทย ทิศต่างๆ เป็นต้น

"R is harder than Python"
[1] "R is harder than Python"
"3"
[1] "3"
"สมศักดิ์"
[1] "สมศักดิ์"
"วิทยาลัยนานาชาตินวัตกรรมดิจิทัล"
[1] "วิทยาลัยนานาชาตินวัตกรรมดิจิทัล"

และสามารถตรวจสอบว่า วัตถุนี้เป็นชนิดตัวษรหรือไม่? ได้โดยใช้คำสั่ง is.character( )

is.character("R is harder than python")
[1] TRUE
is.character("3")
[1] TRUE
is.character(3)
[1] FALSE

สำหรับวัตถุชนิดอักษร เว้นวรรคถึงเป็นหนึ่งตัวอักษร และเราสามารถนับตัวอักษรได้โดยใช้คำสั่ง nchar( ) เช่น

nchar("The quick brown fox jumps over the lazy dog.")
[1] 44

3.8 ข้อมูลชนิดตัวอักษรแบบปัจจัย (factor)

เป็นตัวแปรชนิดตัวอักษรที่ต้องกำหนดลำดับก่อนหลังให้ก่อน เพื่อประโยชน์ในการเปรียบเทียบ เช่น ใน 1 สัปดาห์ประกอบไปด้วยวันจันทร์ถึงวันอาทิตย์ ใน 1 ปีมี 12 เดือนคือ ม.ค. ถึง ธ.ค. ซึ่งจะเห็นได้ชื่อเหล่านี้มีลำดับชัดเจน ชื่อใดมาก่อนหลัง หรือมีปัจจัยใดมีค่ามากกว่ากันแม้จะไม่สามารถวัดด้วยจำนวนได้ เช่น ระดับการศึกษาต่างๆ จาก ปฐมศึกษาจนถึงอุดมศึกษา หรือลำดับชั้นยศทางทหารเป็นต้น

ข้อมูลชนิดนี้จะกล่าวโดยละเอียดในบทต่อไปในหัวข้อที่ 4.5

3.9 การเปลี่ยนชนิดของวัตถุหรือเปลี่ยนประเภทของข้อมูลในอาร์

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

โดยมีตัวอย่างตามตารางดังนี้

คำสั่ง เปลี่ยนวัตถุเป็น
as.numeric ตัวเลข
as.integer จำนวนเต็ม
as.double ตัวเลข
as.character อักษร
as.logical ตรรกศาสตร์
as.factor ปัจจัย

เปลี่ยนตัวเลขจำนวนเต็ม

a <- 3
a <- as.integer(a)
is.integer(a)
[1] TRUE

เปลี่ยนค่าตรรกศาตร์เป็นตัวเลข

b<- as.numeric(TRUE) 
as.numeric(b) 
[1] 1

เปลี่ยนตรรกศาตร์เป็นวัตถุอักษร

c <- as.character(TRUE)
c
[1] "TRUE"

ในหลายกรณีบ้างค่าของวัตถุก็ไม่สามารถเปลี่ยนไปเป็นวัตถุที่ต้องการได้ เช่น

as.integer("A")
Warning: NAs introduced by coercion
[1] NA
as.integer("THREE")
Warning: NAs introduced by coercion
[1] NA

หลักพื้นฐานที่ควรทราบเมื่อต้องการเปลี่ยนชนิดของวัตถุ

  • วัตถุทุกชนิดเปลี่ยนวัตถุตัวอักษรได้

  • วัตถุจำนวนเต็มทุกค่าเปลี่ยนตัวเลขได้

  • วัตถุตัวอักษรที่เขียนเป็นตัวเลขเท่านั้น จึงจะเปลี่ยนค่าเป็นตัวเลขได้ เช่น

as.numeric("3")
[1] 3

ค่าทางตรรกศาสตร์ TRUE มีค่าเป็นตัวเลข 1 และค่าตรรกศาสตร์ FALSE มีค่าเป็นตัวเลข 0

3.10 พื้นที่การทำงานในอาร์ (R workspace)

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

3.10.1 คำสั่ง ls( )

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

num.1 <- 1:10
num.2 <- c(log(50),log(100))

คำสั่ง ls( ) จะแสดงชื่อตัวแปรทั้งหมดที่มีออกมา

ls( )
[1] "a"     "b"     "c"     "F"     "num.1" "num.2"

หลังจากที่มีโปรแกรม RStudio เกิดขึ้น เราจะสามารถเห็นตัวแปรทั้งหมดจากหน้าต่าง Environment

หน้าต่าง Environment ใน RStudio ที่แสดงว่าพื้นที่การทำงานมีตัวแปร 2 ตัว

3.10.2 คำสั่ง rm( )

การลบตัวแปรออกจากพื้นที่การทำงาน สามารถทำได้โดยใช้คำสั่ง rm( ) ในกรณีที่ต้องการลบตัวแปรออกเพียง 1 ตัว เช่น ต้องการลบ num.1 ออกพื้นที่การทำงาน ทำได้ดังนี้

rm(num.1)

ตรวจสอบพื้นที่การงาน โดยใช้คำสั่ง ls( )

ls( )

จะเห็นว่าตัวแปร num.1 ถูกลบออกไปแล้ว

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

ในกรณีที่ต้องการลบตัวทั้งหมดในพื้นที่การทำงานออกไปสามารถทำได้โดยใช้คำสั่งนี้

rm(list = ls( ))

ตรวจสอบพื้นที่การทำงานด้วยคำสั่ง ls( ) อีกครั้ง

ls( )
character(0)

ก็จะพบว่าไม่มีตัวแปรใดๆ อยู่ในหน่วยความจำ

หมายเหตุ character(0) หมายถึง ในพื้นที่การทำงานไม่มีตัวใดๆ อยู่แล้ว ถ้าใน หน้าต่างของ RStudio จะปรากฏภาพดังนี้

ไม่มีตัวแปรในพื้นที่การทำงาน

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

num.1 <- NULL

3.10.3 การบันทึกวัตถุ/ข้อมูลในอาร์

ถ้าต้องการบันทึกตัวแปรทุกตัวในพื้นที่การทำงาน สามารถใช้คำสั่ง save.image( )

save.image(file = "ชื่อไฟล์ที่ต้องการ.Rdata")

ตัวอย่าง สร้างวัตถุขึ้นมา 3 ตัวให้มีชื่อ x y และ z

x <- 20
y <- 34
z <- "house"

ทำการบันทึกในชื่อไฟล์ My_Object.RData

save.image(file = "My_Object.RData")

ในกรณีที่ต้องบันทึกแค่ตัวแปรบางตัว เช่น ต้องการบันทึก ตัว x และ z ในชื่อไฟล์ My_Two_Objects.RData ในกรณีนี้ให้ใช้คำสั่ง save( )

save(y, z, file = "My_Two_Objects.RData")

ถ้าต้องการบันทึกตัวแปรไว้แค่เพียงตัว แนะนำให้ใช้คำสั่ง saveRDS( ) และไฟล์นามสกุล rds

saveRDS(x, file = "my_object.rds")

3.10.4 การเรียกใช้งานไฟล์ RData หรือ rds เข้ามาพื้นที่ทำงานของเรา

ถ้าเป็นไฟล์สกุล RData สามารถใช้คำสั่ง load( ) และระบุชื่อไฟล์ในเครื่องหมายคำพูด \("\)ไฟล์.RData\("\)

load("My_Two_Objects.RData")

และใช้คำสั่ง readRDS( ) สำหรับเรียกใช้ไฟล์สกุล rds โดยมีการเรียกใช้งานเหมือนกับคำสั่ง load( )

readRDS("my_object.rds")
[1] 20
คำแนะนำ

เพื่อให้การทำงานสะดวกขึ้น ควรเก็บทุกไฟล์เกี่ยวข้องไว้ในโฟลเดอร์เดียวกันเสมอ เพื่อให้ง่ายต่อการเรียกใช้ หรือส่งต่อให้ผู้อื่น

3.11 การพื้นที่สำหรับการทำงานหรือจัดเก็บไฟล์ต่างๆ (Working directory in R)

ในกรณีของการทำงานด้วย Rmarkdown ถ้ามีการบันทึกตัวแปรเกิดขึ้น ไฟล์ที่สร้างขึ้นจะอยู่ในโฟลเดอร์เดียวไฟล์ Rmd โดยอัตโนมัติ

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

3.11.1 ค้นหาโฟลเดอร์ที่ใช้ทำงาน (Get working directory)

คำสั่งที่ใช้คือ getwd( ) สำหรับผู้ได้กำหนดให้ข้อมูลหรือไฟล์ที่เกี่ยวข้องอยู่ใน

getwd( )
[1] "/Users/somsak_mac2/Documents/R/DataVizWithR/DATA Viz/chapter3"

3.11.2 กำหนดโฟลเดอร์ที่ใช้การทำงาน( set working directory)

ถ้าต้องการเปลี่ยนโฟลเดอร์ในการจัดเก็บงานต่างๆ สามารถใช้คำสั่ง setwd( ) เช่น

setwd("/Users/somsak_mac2/Documents/R/")

3.11.3 การเปลี่ยนโฟลเดอร์ในการทำงานด้วยเมนูใน RStudio

เหมาะการเริ่มต้นการทำงานใหม่ด้วยอาร์ สามารถดูเมนูได้จากภาพด้านล่าง

เมนู Set Working Directory
หนังสืออาร์ที่อ่านฟรีและคู่มือการใช้งาน

คู่มือการใช้่งานอาร์สามารถโหลดได้จาก

https://cran.r-project.org/manuals.html

จากตารางด้านล่าง หนังสือภาษาอังกฤษที่แนะให้อ่านเพิ่มเติม สำหรับใช้งานอาร์เบื้องต้น คือ

ชื่อหนังสือ ระดับ
An Introduction to R ง่ายและขั้นกลาง
R Data Import/Export ง่ายและขั้นกลาง
R Installation and Administration สูง
Writing R Extensions สูง
R language definition (Draft) สูง
R Internals สูง
The R Reference Index สูง

สำหรับรายชื่อหนังสือ จากดูเวบลิงห์ถัดไป

https://cran.r-project.org/other-docs.html

3.11.4 คู่มือการใช้งานชุดคำสั่งต่างๆ แบบ pdf

ทุกๆ ชุดคำสั่งในอาร์มีมือคู่มือการใช้งานในรูปแบบเวบไซต์หรือ pdf

ตัวอย่างเช่น คู่มือใช้งานชุดคำสั่ง ggplot2 ในรูปแบบเวบไซต์

https://ggplot2.tidyverse.org

สำหรับคู่มือฉบับ pdf สามารถโหลดได้จากเวบ cran-r เช่น https://cran.r-project.org/web/packages/ggplot2/ggplot2.pdf

3.12 ความช่วยเหลือในอาร์ (Help in R)

3.12.1 คำสั่ง help.start( )

สำหรับมือใหม่ สามารถใช้คำสั่ง help.start( ) ใน RStudio เพื่อค้นหาความช่วยเหลือที่ต้องการ

help.start( ) 

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

3.12.2 คำสั่ง help( )

ถ้าเราต้องการอ่านรายละเอียดเพิ่มเกี่ยวกับคำสั่งที่ใช้งาน สามารถใช้คำสั่ง help( ) และใส่ชื่อคำสั่งที่ต้องการทราบลงไป เช่น เราอยากทราบว่า คำสั่ง rnorm( ) คืออะไร

help(rnorm)

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

?rnorm 

วิธีใช้จะอยู่ในรูปแบบ HTML และจะมีคำอธิบายคำสั่ง อาร์กิวเมนต์พร้อมคำจำกัดความ และตัวอย่างการใช้งาน

3.12.3 ความช่วยจากชุดคำสั่ง (The help of a package)

สามารถใช้คำสั่ง help( ) หรือ ? แล้วใส่ชื่อชุดคำสั่งที่ต้องการลงไป

help(stats)
?stats 

3.12.4 คำสั่ง help.search( )

ในกรณีที่ไม่ที่ว่ามีคำสั่งที่เราต้องการหรือไม่ หรือเราเพียงบ้างคำของชุดคำสั่ง เราสามารถค้นหาคำสั่งที่คำที่คำต้องการอยู่หรือไม่ เช่น ถ้าใช้คำว่า median ค้นหา ก็ได้ข้อมูล ที่เป็นทั้งคำตรง และคำใกล้เคียงปรากฏขึ้น

help.search("median")

หมายเหตุ ต้องใช้คำที่ต้องการค้นหาให้อยู่ในเครื่องหมายคำพูดเสมอ

นอกจากนี้เรายังสามารถค้นหาคำสั่งจากชุดคำสั่งที่เฉพาะเจาะจงก็ได้ ดังตัวอย่างต่อไปนี้

help.search("sd", package = "stats")

3.12.5 คำสั่ง apropos( )

เมื่อต้องการค้นหาหัวข้อใดหัวข้อหนึ่ง หรือเมื่อสามารถจำชื่อคำสั่งได้เพียงบางส่วน เราสามารถค้นหาข้อความนั้นด้วยฟังก์ชัน apropos( ) ตัวอย่างเช่น ในกรณีที่ต้องการค้นหาฟังก์ชันที่เกี่ยวข้องกับ plot( ) ด้วยคำสั่ง apropos( ) จะแสดงคำสั่งทั้งหมดที่มีคำว่า \("\)plot\("\) อยู่ในชื่อของคำสั่ง

apropos("plot", mode = "function")
 [1] "assocplot"           "barplot"             "barplot.default"    
 [4] "biplot"              "boxplot"             "boxplot.default"    
 [7] "boxplot.matrix"      "boxplot.stats"       "cdplot"             
[10] "coplot"              "fourfoldplot"        "interaction.plot"   
[13] "lag.plot"            "matplot"             "monthplot"          
[16] "mosaicplot"          "plot"                "plot"               
[19] "plot.default"        "plot.design"         "plot.ecdf"          
[22] "plot.function"       "plot.new"            "plot.spec.coherency"
[25] "plot.spec.phase"     "plot.stepfun"        "plot.ts"            
[28] "plot.window"         "plot.xy"             "preplot"            
[31] "qqplot"              "recordPlot"          "replayPlot"         
[34] "savePlot"            "screeplot"           "spineplot"          
[37] "sunflowerplot"       "termplot"            "ts.plot"            

จะเห็นว่าการค้นหาที่ มีคำสั่งที่ปรากฏ มีคำสั่งว่า Plot หรือมีคำว่า plot ปรากฏด้านหน้า ระหว่างคำ หรือ ด้านหลัง

ถ้าเราสนใจเฉพาะคำสั่งที่มีแต่คำว่า plot ปรากฏขึ้นเป็นคำหน้าเท่านั้น ก็สามารถทำได้โดยใส่ เครื่องหมาย ^ นำหน้า plot เพื่อทำการค้นหา เช่น

apropos("plot^", mode = "function")
character(0)
apropos("^plot", mode = "function")
 [1] "plot"                "plot"                "plot.default"       
 [4] "plot.design"         "plot.ecdf"           "plot.function"      
 [7] "plot.new"            "plot.spec.coherency" "plot.spec.phase"    
[10] "plot.stepfun"        "plot.ts"             "plot.window"        
[13] "plot.xy"            

3.12.6 คำสั่ง RSiteSearch( )

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

RSiteSearch( ) ค้นหาจากบรานเซอร์หลักที่เราเลือกใช้ เช่น

RSiteSearch("plot")

3.12.7 R cheat sheets

คำแนะนำสำหรับการใช้งานคำสั่ง จากชุดชุดคำสั่ง เช่น ggplot2 หรือ dplyr สามารถโหลดได้จาก https://RStudio.com/resources/cheatsheets/

หรือจากในเมนูใน RStudio ก็ได้

3.12.8 คำสั่ง data( )

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

data( )

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

data(package = .packages(all.available = TRUE))

เราสามารถใช้ค้นหารายละเอียดของชุดข้อมูลที่ต้องการโดยคำสั่ง help( ) หรือ ? ก็ได้

เช่น

help("cars")

or

?cars

3.12.9 คำสั่ง example( )

กรณีที่เราต้องการ เห็นผลลัพธ์ตัวอย่างจากการใช้งานคำสั่ง สามารถพิมพ์คำสั่งที่ต้องการในเครื่องหมายคำพูด ใส่ในคำสั่ง example( ) เช่น ตัวอย่างการงานคำสั่ง mean

example("mean")

mean> x <- c(0:10, 50)

mean> xm <- mean(x)

mean> c(xm, mean(x, trim = 0.10))
[1] 8.75 5.50

ให้ผู้อ่านใช้คำสั่งต่อไปนี้

example("var")
example("plot")

3.13 ตัวดำเนินการในอาร์ (R Operators)

ภาษาอาร์มีตัวดำเนินการหลายแบบ เช่น

  • ตัวดำเนินการเลขคณิต (arithmetic operators) สำหรับการคำนวณทางคณิตศาสตร์

  • ตัวดำเนินการเชิงสัมพันธ์ (relational operators) สำหรับการเปรียบเทียบค่าต่างๆแล้วได้ผลลัพธ์เป็น TRUE หรือ FALSE ที่เป็นเพียงหนึ่งประพจน์

  • ตัวดำเนินการแบบตรรกศาสตร์ (logical operators) สำหรับการหาผลลัพธ์ของ สองประพจน์ข้ึนไป แล้วได้ผลลัพธ์เป็นค่า TRUE หรือ FALSE

  • ตัวดำเนินการกำหนด (assignment operators) เป็นสร้างตัวแปรขึ้นมาให้เป็นชื่อเรียกต่างๆ เพื่อเก็บค่าไว้ในหน่วยความจำเพื่อให้พร้อมสำหรับการเรียกใช้งานโดยไม่ต้่องทำการประมวลผลใหม่

  • ตัวดำเนินการไปป์ (pipe operators) เป็นการขั้นการโค้ดด้วยภาษาอาร์ให้มีความกระชับการและอ่านได้ง่ายขึ้น

3.13.1 ตัวดำเนินการเลขคณิต (arithmetic operators)

คือกระบวนการที่เกี่ยวข้องการคำนวณแบบต่างของตัวเลข เช่น บวก ลบ คูณ หาร เป็นต้น

ตัวดำเนินการเลขคณิตในอาร์ คำอธิบาย
+ การบวก (plus)
- การหาร (minus)
* การคูณ (multiplication)
/ การหาร (division)
^ การยกกำลัง (exponential)
** การยกกำลัง (exponential)
%% การหารเอาเศษ (modulus)
%/% การหารเอาส่วน (integer divide)
%*% การคูณกับแบบเมตริกซ์ (matrix multiplication)

ตัวอย่าง

การคำนวณง่ายๆ ด้วยจำนวนจริง

3 + 5 
[1] 8
8 - 3  
[1] 5
7 * 5   
[1] 35
1/2    
[1] 0.5
4 ^ 4  
[1] 256
4 ** 4 
[1] 256
5 %% 3  
[1] 2
5 %/% 3 
[1] 1

ใบบทต่อไปจะมีชนิดของตัวแปรที่เป็นเวคเตอร์ (vector)

สำหรับกระบวนการเลขคณิตสำหรับตัวแปรเวคเตอร์จะได้ผลลัพธ์ดังนี้

x <- c(1, 7, 3)
y <- c(9, 4, 5)
x + y  
[1] 10 11  8
x - y   
[1] -8  3 -2
x * y   
[1]  9 28 15
x / 2  
[1] 0.5 3.5 1.5
x ** y 
[1]    1 2401  243
x ^ y  
[1]    1 2401  243
x %% y 
[1] 1 3 3
x %/% y 
[1] 0 1 0

จะเห็นได้ว่าเป็นการทำต่อกันสำหรับสำหรับตัวเลขที่อยู่ในลำดับหรือตำแหน่งเดียวกันเท่านั้น

สำหรับตัวแปรประเภทเมตริกซ์จะกล่าวถึงในบทต่อไป

3.13.2 ตัวดำเนินการเชิงสัมพันธ์ (relational operators)

เป็นเปรียบค่าจะหว่างกัน ของประพจน์ และได้ผลลัพธ์เป็น TRUE หรือ FALSE

ตัวดำเนินการเชิงสัมพันธ์ คำอธิบาย
> มากกว่า (greater than)
< น้อยกว่า (lower than)
>= มากว่าหรือเท่ากับ (greater or equal than)
<= น้อยกว่าหรือเท่ากับ (lower or equal than)
== มีค่าเท่ากัน (equal to)
!= มีค่าไม่เท่ากัน (not equal to)

ตัวอย่าง

3 > 5  
[1] FALSE
3 < 5  
[1] TRUE
3 >= 5 
[1] FALSE
3 <= 5 
[1] TRUE
3 == 5 
[1] FALSE
3 != 5 
[1] TRUE

สำหรับตัวแปรเวคเตอร์ จะเป็นการเปรียบเทียบแต่ละค่าที่ลำดับหรือตำแหน่งเดียวกัน

x <- c(12, 4 , 14)
y <- c(3, 4, 15)
x >= y 
[1]  TRUE  TRUE FALSE
x <= y 
[1] FALSE  TRUE  TRUE
x == y 
[1] FALSE  TRUE FALSE
x != y 
[1]  TRUE FALSE  TRUE

3.13.3 ตัวดำเนินการแบบตรรกศาสตร์ (logical operators)

เป็นการเชื่อมประพจน์ตั้งแต่สองประพจน์ขึ้น และได้ผลลัพธ์เป็นค่า TRUE หรือ FALSE

ตัวดำเนินการแบบตรรกศาสตร์ คำอธิบาย
\(\&\) และ (AND) สำหรับเชื่อมตัวแปรที่มีค่าเดียว
\(\&\&\) และ (AND) สำหรับเชื่อมตัวแปรที่เป็นเวคเตอร์หรือเมตริกซ์
\(∣\) หรือ (OR) สำหรับเชื่อมตัวแปรที่มีค่าเดียว
|| หรือ (OR) สำหรับเชื่อมตัวแปรที่เป็นเวคเตอร์หรือเมตริกซ์
! นิเสธ (NOT)
xor( ) นิเสธของหรือ (Not OR)

กฏตรรกศาสตร์พื้นฐาน

ถ้าประพจน์ 2 ประพจน์ดำเนินการต่อกันด้วยเครื่องหมายและ

ค่าตวามจริงประพจน์ A ค่าตวามจริงประพจน์ B ผลลัพธ์ A&B
TRUE TRUE TRUE
TRUE FALSE FALSE
FALSE TRUE FALSE
FALSE FALSE FALSE

ถ้าประพจน์ 2 ประพจน์ดำเนินการต่อกันด้วยเครื่องหมายหรือ

ค่าตวามจริงประพจน์ A ค่าตวามจริงประพจน์ B ผลลัพธ์ A|B
TRUE TRUE TRUE
TRUE FALSE TRUE
FALSE TRUE TRUE
FALSE FALSE FALSE

ค่านิเสธของประพจน์

ค่าตวามจริงประพจน์ A ผลลัพธ์ !A
T F
F T

ตัวอย่าง

(3>5)&(4<2)
[1] FALSE
(3>5)|(4<2)
[1] FALSE
!(4==4)
[1] FALSE
!(3>5)|(4<2)    
[1] TRUE
!((3>5)|(4<2))  
[1] TRUE

3.13.4 ตัวดำเนินการกำหนด (assignment operators)

คือการกำหนดชื่อให้ตัวแปรเพื่อเก็บค่าไว่ในหน่วยความจำ เพื่อให้ง่ายต่อการนำมาใช้งานซ้ำอีกครั้ง

การดำเนินการ คำอธิบาย
<- กำหนดให้ตัวแปรทางซ้ายมีค่าเท่ากับค่าที่กำหนด
-> กำหนดให้ตัวแปรทางขวามีค่าเท่ากับค่าที่กำหนด
= กำหนดให้ตัวแปรทางซ้ายมีค่าเท่ากับค่าที่กำหนด (ไม่แนะนำใช้การเขียนรูปแบบนี้ ควรใช้ในกรณีที่กำหนดค่าให้กับตัวแปรในคำสั่งเท่านั้น)

แต่เพื่อให้ง่ายต่อการอ่านโค้ดที่เขียนได้ง่านขึ้น ควรใช้ <- สำหรับการกำหนดค่าตัวแปรที่สามารถเห็นได้จากหน้าต่าง global environment ใน RStudio หรือค้นเจอด้วยคำสั่ง ls( ) หรือเป็น ดำเนินการให้ค่ากับตัวแปรภายในชุดคำสั่ง

ตัวอย่าง

x <- 3
3 -> y
ADD <- function(x,y){
        result <- x + y
        return(result)
        }

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

x
[1] 3
y
[1] 3

สำหรับตัวดำเนินการเท่ากับ (=) ควรใช้เพื่อกำหนดให้ตัวแปรภายในคำสั่งมีค่าเท่ากับที่เรากำหนด

ตัวอย่าง

ADD(x = 2, y = 3)
[1] 5
rnorm(n = 2, mean = 0, sd = 2)
[1] -1.463111 -1.879985

3.13.5 การตั้งชื่อตัวแปร (variable name)

หลักการตั้งชื่อตัวแปร เราสามารถใช้ตัวอักษร ตัวเลข จุด(.) หรือขีดล่าง(_)ในชื่อตัวแปรได้ แต่ขีดล่างและตัวเลขไม่สามารถเป็นอักขระตัวแรกของชื่อตัวแปรได้ในอาร์ได้

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

if else repeat while function for in next break

TRUE FALSE NULL Inf NaN NA NA_integer_ NA_real_ NA_complex_ NA_character_

คำสงวนเพิ่มเติม ศึกษาได้จาก

help(Reserved) 

ต้องการตั้งชื่อตัวแปรของคุณด้วยคำสงวนหรือขึ้นต้นด้วยเครื่องหมายขีดล่าง หรือมีการเว้นวรรค เราจะจะต้องใช้เครื่องหมาย \(^\backprime\)(backticks) ในการตั้งชื่อตัวแปร ในกรณี ที่ชื่อตัวแปรจำเป็นต้องเว้นวรรค หรือมีเครื่องหมายพิเศษ ที่ไม่สามารถใช้ต้องชื่อได้ เช่น - ? * + / เป็นต้น

_variable <- 10    
Error: <text>:1:2: unexpected symbol
1: _variable
     ^
`_variable` <- 10 
`_variable`
[1] 10
TRUE <- 10  
Error in TRUE <- 10: invalid (do_set) left-hand side to assignment
`TRUE` <- 10
`TRUE`
[1] 10
somsak chanaim <- 2
Error: <text>:1:8: unexpected symbol
1: somsak chanaim
           ^
`somsak chanaim` <- 2
`somsak chanaim`
[1] 2

3.13.6 ตัวดำเนินการเบ็ดเตล็ด (miscellaneous operators)

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

ตัวดำเนินการ คำอธิบาย
$ การเข้าถึงตัวแปรในกรอบข้อมูล (data frame)
: การสร้างลำดับจำนวนเต็ม
:: การเรียกใช้่คำสั่งจากชุดคำสั่งที่ต้องการ
\(\sim\) ตัวแบบทางสถิติ
@ การเข้าถึงตัวแปรประเภท S4 classes(ขึ้นสูง)
%in% พิจารณาเลือกค่าที่สนใจ ที่อยู่ในภายนี้วัตถุหรือไม่

ตัวอย่างการใช้งานตัวดำเนินการ $

df <- data.frame(x = c(7, 9), y = c(5, 9))
df$x
[1] 7 9

ตัวดำเนินการ :

1:5
[1] 1 2 3 4 5

ตัวดำเนินการ ::

ggplot2::diamonds

ตัวดำเนินการ \(\sim\)

lm(y ~ x,data = df)

Call:
lm(formula = y ~ x, data = df)

Coefficients:
(Intercept)            x  
         -9            2  

ตัวดำเนินการ \%in\%

พิจารณาว่าค่า \("\)A\("\) อยู่ในตัวแปร LETTERS หรือไม่

"A" %in% LETTERS
[1] TRUE

3.13.7 ตัวดำเนินการไปป์ (Pipe operator)

ตัวดำเนินการไปร์เป็นตัวดำเนินการใหม่ของอาร์รุ่น 4.1 ขึ้นไป เราสามารถอ่านโอเปอเรเตอร์นี้เป็น ‘AND THEN’ และจุดประสงค์ของมันคือเพื่อลดความซับซ้อนของไวยากรณ์เมื่อเขียนคำสั่งด้วยอาร์ ตัวอย่างเช่น จากข้อมูล cars เราสนใจจะหาสถิติพรรณาของข้อมูลที่ตัวแปร dist มีค่ามากกว่า 20

ถ้าไม่ใช้ตัวดำเนินการไปป์

summary(subset(x = cars, dist > 20))
     speed            dist       
 Min.   : 7.00   Min.   : 22.00  
 1st Qu.:13.75   1st Qu.: 32.00  
 Median :17.00   Median : 46.00  
 Mean   :16.95   Mean   : 50.45  
 3rd Qu.:20.00   3rd Qu.: 64.50  
 Max.   :25.00   Max.   :120.00  

ถ้าใช้ตัวดำเนินการไปป์

cars |> subset(dist > 20) |> summary( )
     speed            dist       
 Min.   : 7.00   Min.   : 22.00  
 1st Qu.:13.75   1st Qu.: 32.00  
 Median :17.00   Median : 46.00  
 Mean   :16.95   Mean   : 50.45  
 3rd Qu.:20.00   3rd Qu.: 64.50  
 Max.   :25.00   Max.   :120.00  

จะเห็นว่าการใช้ตัวดำเนินการไปร์ มีการเขียนคำสั่งที่อ่านได้ง่ายกว่า

การเขียนโค้ดด้วยตัวดำเนินการไปป์

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