ทำความรู้จักโปรแกรม R เบื้องต้น

โปรแกรม R คืออะไร?

โปรแกรม R (R Programming Language) คือ ภาษาโปรแกรมคอมพิวเตอร์ภาษาหนึ่งที่ถูกพัฒนาโดยนักสถิติ 2 ท่าน คือ Ross Ihaka และ Robert Gentleman ในราวปีค.ศ. 1996โดยมีวัตถุประสงค์เพื่อใช้ในการเรียนปฏิบัติการสำหรับวิชาสถิติ ดังนั้นโปรแกรม R จึงมีจุดเด่นในการวิเคราะห์ข้อมูลเชิงสถิติ ทั้งในด้านการมองภาพข้อมูล (Data Visualization) การนำเสนอข้อมูลด้วยสถิติเชิงพรรณนา (Descriptive Statistics) และการวิเคราะห์ข้อมูลด้วยวิธีเชิงสถิติขั้นสูง ซึ่งในโปรแกรม R สามารถติดตั้งแพ็กเกจ (Package) สำหรับการวิเคราะห์ข้อมูลด้วยสถิติขั้นสูงที่พัฒนาขึ้นมาใหม่จากนักวิจัยหลากหลายสาขา

ปัจจุบันโปรแกรม R อยู่ภายใต้การดูแลและพัฒนาโดยกลุ่มอาสาสมัคร R Core development team โดยมีศูนย์กลางและสารสนเทศต่าง ๆ เกี่ยวกับโปรแกรม R อยู่ที่ www.r-project.org รวมถึงตัวติดตั้งโปรแกรม R ก็สามารถดาวน์โหลดได้จากเว็บไซต์ดังกล่าว เวอร์ชันล่าสุดของโปรแกรม R คือ

R 4.1.0 ในเดือนพฤษภาคม พ.ศ. 2564 พร้อมทั้งคู่มือการใช้งานโปรแกรม R เบื้องต้นที่สามารถสืบค้นได้จาก

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

โปรแกรม R ถือว่าเป็นเครื่องมือที่ได้รับความนิยมสำหรับนักวิเคราะห์ข้อมูลและนักวิทยาการข้อมูล เนื่องจากโปรแกรม R เป็น Open Source สามารถดาวน์โหลดมาติดตั้งได้ฟรี และมีข้อดีหลาย ๆ อย่าง ดังนี้

  • มีประสิทธิภาพในการจัดการกับข้อมูลรวมถึงในด้านการจัดเก็บข้อมูล และทำงานกับข้อมูลขนาดใหญ่ได้เป็นอย่างดี

  • มีระบบช่วยเหลือที่ดีเยี่ยมและมี community ขนาดใหญ่

  • มีประสิทธิภาพในการนำเสนอข้อมูลด้วยกราฟิก

  • มีฟังก์ชันสำหรับวิเคราะห์ข้อมูลด้วยสถิติสมัยใหม่

  • ผู้ใช้สามารถเขียนฟังก์ชันขึ้นเองโดยใช้คำสั่งที่ไม่ยุ่งยาก

การดาวน์โหลดและติดตั้งโปรแกรม R

โปรแกรม R สามารถดาวน์โหลดได้ฟรีที่เว็บไซต์หลักของ R ซึ่งในที่นี้ขอแสดงตัวอย่างการดาวน์โหลดและติดตั้งโปรแกรม R เวอร์ชัน 4.0.2 ดังขั้นตอนต่อไปนี้

ขั้นตอนที่ 1 เข้าสู่เว็บไซต์ www.r-project.org และคลิกที่ download R ดังรูป

รูปที่ 1.1 หน้าต่างเว็บไซต์ R Project for Statistical Computing

ขั้นตอนที่ 2 เลือก CRAN Mirrors ที่ต้องการดาวน์โหลดตัวติดตั้งโปรแกรม R (เลือกประเทศใดก็ได้)

รูปที่ 1.2 หน้าต่าง CRAN Mirrors

ขั้นตอนที่ 3 เลือกดาวน์โหลดตัวติดตั้งโปรแกรม R ที่ตรงกับระบบปฏิบัติการของเครื่องคอมพิวเตอร์ของท่าน โดยในที่นี้จะเลือกระบบปฏิบัติการ Windows ดังรูป

เลือกดาวน์โหลดตัวติดตั้งโปรแกรม R

ขั้นตอนที่ 4 เลือกตัวติดตั้งโปรแกรม R หากเป็นการติดตั้งโปรแกรม R ครั้งแรกให้คลิกที่ base ดังรูป

เลือกตัวติดตั้งโปรแกรม R

ขั้นตอนที่ 5 คลิกดาวน์โหลดตัวติดตั้งโปรแกรม R โดยเลือกตัวติดตั้งตามระบบปฏิบัติการบนเครื่องของคอมพิวเตอร์ของเรา หากเครื่องคอมพิวเตอร์ของเราเป็นระบบปฏิบัติการ Windows ให้เลือก R 4.0.2 for Windows

ดาวน์โหลดตัวติดตั้งโปรแกรม R

เมื่อดาวน์โหลดตัวติดตั้งโปรแกรม R เรียบร้อยแล้วจะได้ไฟล์ตัวติดตั้งโปรแกรม R

ชื่อ R-4.0.2 -win.exe จากนั้นให้ทำการติดตั้งโปรแกรม R บนเครื่องคอมพิวเตอร์ ดังขั้นตอนต่อไปนี้

ขั้นตอนที่ 1 ดับเบิ้ลคลิกที่ไฟล์ R-4.0.2 -win.exe จะมีหน้าต่างการติดตั้งแสดงขึ้นมาดังรูป แล้วให้คลิก OK

เลือกภาษาในการติดตั้งโปรแกรม R

ขั้นตอนที่ 2 ในหน้าต่างสารสนเทศเกี่ยวกับโปรแกรม R ให้คลิกปุ่ม Next

หน้าต่างสารสนเทศเกี่ยวกับโปรแกรม R

ขั้นตอนที่ 3 เลือกตำแหน่งที่ต้องการติดตั้งโปรแกรม R หากไม่ต้องการเปลี่ยนตำแหน่งที่จะติดตั้งโปรแกรม ให้คลิกปุ่ม Next

หน้าต่างตำแหน่งที่ต้องการติดตั้งโปรแกรม

ขั้นตอนที่ 4 เลือกองค์ประกอบที่ต้องการติดตั้งในโปรแกรม R หากไม่ต้องการเปลี่ยนตำแหน่งที่จะติดตั้งโปรแกรม ให้คลิกปุ่ม Next

เลือกองค์ประกอบในการติดตั้งโปรแกรม

หากไม่ต้องการเปลี่ยนแปลงให้คลิกปุ่ม Next

ตัวเลือกในการเริ่มต้นโปรแกรม

ขั้นตอนที่ 6 เลือกทางลัดในการเข้าสู่โปรแกรม R เสร็จแล้วให้คลิกปุ่ม Next

ตัวเลือกเพิ่มเติมในการติดตั้งโปรแกรม

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

เริ่มต้นเข้าสู่โปรแกรม R

การทำงานบน R ส่วนใหญ่จะเป็นการทำงานภายใต้ระบบปฏิสัมพันธ์ (interactive) โดยเมื่อป้อนคำสั่งให้โปรแกรมทำงานก็จะได้รับผลจากการประมวลผลในทันที

ในหน้าต่าง R Console จะเห็นว่ามีเครื่องหมาย prompt (>) ปรากฏอยู่ เครื่องหมายดังกล่าวหมายถึง พร้อมใช้งาน หรือ พร้อมรับคำสั่ง โดยการกระทำในโปรแกรม R จะสามารถป้อนคำสั่งได้หลังเครื่องหมาย prompt และเมื่อจบคำสั่งแล้วกดแป้น Return หรือ Enter เพื่อสั่งให้โปรแกรม R ประมวลก็จะได้รับผลการประมวลผลในทันที ถ้าหากคำสั่งยาวเกินหนึ่งบรรทัดจะปรากฏเครื่องหมาย + ในบรรทัดถัดไปโดยอัตโนมัติ ซึ่งหมายความว่าคำสั่งนั้นยังไม่สมบูรณ์ และจะต้องป้อนคำสั่งให้ครบถ้วนสมบูรณ์ เมื่อจบคำสั่งและต้องการผลลัพธ์ให้กดแป้น Enter ก็จะปรากฏผลลัพธ์ในบรรทัดถัดไป

นอกจากนี้ยังสามารถทำงานบน R Editor โดยเปิดใช้จาก File > New script จะปรากฏหน้าต่าง R Editor ขึ้นมาเพื่อใช้ในการเขียนคำสั่งหรือสคริปท์ (R script) ต่าง ๆ และยังสามารถบันทึกคำสั่งเหล่านั้นเก็บไว้เพื่อเรียกใช้งานในครั้งต่อไปได้

การใช้งาน R Editor

การวิเคราะห์ข้อมูลด้วยสถิติสมัยใหม่ที่ถูกพัฒนาขึ้นเพื่อให้ทันต่อสถานการณ์ปัจจุบันสามารถดำเนินการได้โดยใช้โปรแกรม R ผ่านการเรียกใช้งานชุดคำสั่งหรือแพ็กเกจ (Package) ต่าง ๆ ที่ถูกเขียนคำสั่งจากผู้ใช้งานโปรแกรม R ทั่วโลกและได้รับการตรวจสอบจาก R core-development team เรียบร้อยแล้ว โดยที่แพ็กเกจ เหล่านั้นสามารถเรียกติดตั้งได้จากเครือข่ายของ R (The Comprehensive R Archive Network: CRAN) ข้อมูลเมื่อวันที่ 7 มิถุนายน 2564 มีแพ็กเกจให้เรียกใช้งานได้จาก CRAN จำนวนทั้งสิ้น 17,690 แพ็กเกจ

ดังที่ได้กล่าวไปแล้วว่า การใช้งานโปรแกรม R จะต้องเขียนคำสั่ง ซึ่งอาจจะเป็นอุปสรรคในการใช้งานอยู่บ้าง John Fox และ Milan Bouchet-Valat จึงได้พัฒนา R Commander ขึ้นมา

โดย R Commander เป็น GUI (graphical user interface) ของโปรแกรม R ถูกสร้างขึ้นเพื่อให้ผู้ใช้งานสามารถสื่อสาร โต้ตอบกับโปรแกรม R ผ่านการคลิกเมนูต่าง ๆ แทนที่จะเป็นการเขียนโปรแกรม

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

นอกจาก R Commander แล้วยังมีโปรแกรมอื่น ๆ อีกหลายโปรแกรมที่เขียนขึ้นมาเพื่อให้สามารถเขียนโปรแกรมด้วยโปรแกรม R ได้ง่ายมากขึ้น เช่น RStudio, Deducer, Rattle และ Jamovi เป็นต้น ซึ่งในที่นี้จะใช้โปรแกรม RStudio เนื่องจากเป็นโปรแกรมฟรีที่ได้รับความนิยมเป็นอย่างมาก ง่ายต่อการจัดการและการเขียนโปรแกรม

การติดตั้งโปรแกรม RStudio

RStudio เป็นฟรีแวร์ที่สามารถดาวน์โหลดตัวติดตั้งได้จากเว็บไซต์ https://www.rstudio.com และ RStudtio ยังได้เผยแพร่เอกสารการใช้งานโปรแกรม R และแพ็กเกจบางตัวไว้บนเว็บไซต์ดังลิงค์ต่อไปนี้ https://www.rstudio.com/resources/cheatsheets/

การดาวน์โหลดตัวติดตั้ง RStudio มีขั้นตอนดังรูป โดยคลิกเลือกที่ Products > RStudio

การดาวน์โหลดตัวติดตั้งโปรแกรม RStudio

การดาวน์โหลด RStudio

การเลือกดาวน์โหลดตัวติดตั้ง RStudio สำหรับแต่ละระบบปฏิบัติการ

เมื่อทำการดาวน์โหลดตัวติดตั้งและทำการติดตั้งโปรแกรม RStudio เสร็จแล้วทำการเปิดโปรแกรมขึ้นมาจะพบหน้าต่างโปรแกรมดังนี้

หน้าต่างโปรแกรม RStudio

การติดตั้งแพ็กเกจ

การติดตั้งแพ็กเกจที่อยู่บน CRAN จำเป็นต้องมีการเชื่อมต่อสัญญาณอินเทอร์เน็ตก่อน โดยสามารถติดตั้งแพ็กเกจได้ด้วยเมนู โดยคลิกที่เมนู Packages แล้วเลือก Install จะมีหน้าต่าง install packages ขึ้นมาให้เราเลือกวิธีการติดตั้งแพ็กเกจ หากต้องการติดตั้งแพ็กเกจที่อยู่บน CRAN สามารถป้อนชื่อแพ็กเกจที่ต้องการติดตั้งในช่อง Packages ได้เลย ดังรูป

ตัวอย่าง การติดตั้งแพ็กเกจ ggplot2 ดังต่อไปนี้

การติดตั้งแพ็กเกจ

นอกจากนี้การติดตั้งแพ็กเกจเสริมในโปรแกรม R สามารถทำได้โดยใช้คำสั่ง

{.r .install.packages('package .name')} install.packages('package name')

ตัวอย่าง การติดตั้งแพ็กเกจ tidyverse โดยใช้คำสั่ง install.packages()

install.packages("tidyverse")

เมื่อทําการติดตั้งแพ็กเกจเรียบร้อยแล้วต้องทําการเรียกใช้งานแพ็กเกจที่ถูกติดตั้งบนคอมพิวเตอร์ของเราแล้วดังนี้

library(package name) หรือ require(package name)

ตัวอย่าง กาเรียกใช้แพ็กเกจ tidyverse โดยใช้คำสั่ง library()

library(tidyverse)
## -- Attaching packages --------------------------------------- tidyverse 1.3.1 --
## v ggplot2 3.3.3     v purrr   0.3.4
## v tibble  3.1.2     v dplyr   1.0.6
## v tidyr   1.1.3     v stringr 1.4.0
## v readr   1.4.0     v forcats 0.5.1
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()

พื้นที่การทำงาน

ในการทำงานบนโปรแกรม R สามารถกำหนดตำแหน่งหรือพื้นที่ในการทำงาน (Working directory) โดยเรียกใช้ฟังก์ชัน setwd(“ระบุตำแหน่ง directory”) เช่น setwd(“D:/”) นอกจากนี้ยังสามารถเรียกดูตำแหน่งการทำงาน ณ ปัจจุบันได้จากฟังก์ชัน getwd() หรือสามารถเปลี่ยนพื้นที่ในการทำงานได้โดยคลิกที่เมนู Session > Set working directory > Choose working directory ดังรูป

การเปลี่ยนพื้นที่การทำงานในโปรแกรม RStudio

#setwd("Lab208250")

ประเภทข้อมูลในโปรแกรม R

ข้อมูลในโปรแกรม R มีหลายประเภทด้วยกัน ดังตัวอย่างในตาราง

ประเภทข้อมูลในโปรแกรม R
ประเภทข้อมูล คำอธิบาย ตัวอย่าง
Logical ข้อมูล Boolean TRUE หรือ FALSE
Numerical ข้อมูลเชิงตัวเลข 12.3 หรือ 3 หรือ 5.9
Integer ข้อมูลจำนวนเต็ม 2L หรือ 1L
Complex ข้อมูลตัวเลขเชิงซ้อน 3+2i
Character ข้อมูลตัวอักษร ‘a’ หรือ “b” หรือ ‘4’
Raw ข้อมูลดิบ “Hello” is started at

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

is.numeric()

is.character()

is.integer()

ตัวอย่าง

x <- 1
a <- 'a'
b <- 2.4
is.numeric(x)
## [1] TRUE
is.numeric(a)
## [1] FALSE
is.integer(b)
## [1] FALSE

โครงสร้างข้อมูลในโปรแกรม R

เวกเตอร์ (Vector)

R เป็นภาษาที่ทำงานในเชิง numeric ที่เก็บข้อมูลเป็นเวกเตอร์ เรียกเวกเตอร์นั้นว่า object หรือที่เรียกว่า ตัวแปร ในทางสถิตินั่นเอง

การเก็บข้อมูลเพียงตัวเดียวหรือสเกลาร์

object <- value
หรือ 
object = value

ตัวอย่าง

x <- 5
print(x)
## [1] 5

การสร้างเวกเตอร์สำหรับข้อมูล

c(value_1, value_2,…, value_n) 

ตัวอย่าง

y <- c(1,2,3,4, 5)
print(y)
## [1] 1 2 3 4 5

การสร้างข้อมูลที่มีค่าเป็นลำดับ

start:end
หรือ
seq(start, end, by = )

ตัวอย่าง

z <- 1:5
print(z)
## [1] 1 2 3 4 5
z2 <- seq(1, 5, by = 1)
print(z2)
## [1] 1 2 3 4 5
z2 <- seq(1,5,by=1)

การสร้างข้อมูลที่มีค่าซ้ำกัน

rep(value, times)

ตัวอย่าง

k <- rep(1, 5)
print(k)
## [1] 1 1 1 1 1

เมื่อต้องการสร้างเวกเตอร์ที่เก็บข้อมูลที่มีค่าซ้ำกันทั้งเวกเตอร์ สามารถทำได้ดังนี้

rep(start:end, times) 

ตัวอย่าง

k2 <- rep(1:5, times = 4)
print(k2)
##  [1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5

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

rep(start:end, each) 

ตัวอย่าง

k3 <- rep(1:5,each = 4)
print(k3)
##  [1] 1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4 5 5 5 5

การสร้างข้อมูลเป็นตัวอักษร

object <- "ตัวอักษร" หรือ object <- 'ตัวอักษร'

ตัวอย่าง

a <- "A" 

print(a)
## [1] "A"
b <- 'B'
print(b)
## [1] "B"

เมทริกซ์ (Matrix)

การสร้างเมทริกซ์ จะเรียกใช้ฟังก์ชัน matrix() ดังต่อไปนี้

matrix(เวกเตอร์ข้อมูล, nrow = จำนวนแถว, ncol= จำนวนหลัก)

ตัวอย่าง

m <- matrix(k2, nrow = 4)
print(m)
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    1    5    4    3    2
## [2,]    2    1    5    4    3
## [3,]    3    2    1    5    4
## [4,]    4    3    2    1    5

การหามิติของเมทริกซ์ (Dimension)

ในการหามิติของเมทริกซ์ว่ามีจำนวนกี่แถวและกี่หลักจะหาได้จากการใช้ฟังก์ชัน dim() ดังนี้

dim(m)
## [1] 4 5

การสลับแถวและหลักเมทริกซ์ (Transpose)

ในการสลับแถวและหลักของเมทริกซ์ใด ๆ จะทำได้โดยการเรียกใช้ฟังก์ชัน t() ดังนี้

tm <- t(m)

การหาผลคูณของเมทริกซ์ (Product)

ในการหาผลคูณของเมทริกซ์จะหาได้จากการใช้เครื่องหมาย % * % ดังนี้

mm <- tm%*%m
print(mm)
##      [,1] [,2] [,3] [,4] [,5]
## [1,]   30   25   25   30   40
## [2,]   25   39   33   32   36
## [3,]   25   33   46   39   37
## [4,]   30   32   39   51   43
## [5,]   40   36   37   43   54

นอกจากนี้ยังสามารถสร้างหรือเปลี่ยนชื่อแต่ละเวกเตอร์ และชื่อระเบียนข้อมูลในเมทริกซ์ใด ๆ ได้ โดยใช้ฟังก์ชัน colnames() และ rownames() ตามลำดับ ดังนี้

colnames(mm) <- c("var1","var2","var3", "var4", "var5")
rownames(mm) <- c("record1","record2","record3", "record4", "record5")
print(mm)
##         var1 var2 var3 var4 var5
## record1   30   25   25   30   40
## record2   25   39   33   32   36
## record3   25   33   46   39   37
## record4   30   32   39   51   43
## record5   40   36   37   43   54

แฟ้มข้อมูล (Data frame)

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

dataset1 <- data.frame(x, y, z)

หรือ

dataset2 <- cbind(x, y, z)

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

nrow(dataset1)
## [1] 5
ncol(dataset1)
## [1] 3

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

colnames(dataset1)
## [1] "x" "y" "z"
rownames(dataset1)
## [1] "1" "2" "3" "4" "5"

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

colnames(dataset1) <- c("indepedent", "response1", "respose2")
dataset1
##   indepedent response1 respose2
## 1          5         1        1
## 2          5         2        2
## 3          5         3        3
## 4          5         4        4
## 5          5         5        5
rownames(dataset1) <- c("unit1","unit2","unit3","unit4","unit5")
dataset1
##       indepedent response1 respose2
## unit1          5         1        1
## unit2          5         2        2
## unit3          5         3        3
## unit4          5         4        4
## unit5          5         5        5

ลิสต์ (List)

ในการสร้างชุดข้อมูลที่ประกอบไปด้วยข้อมูลหลายประเภทอาจจะสร้างชุดข้อมูลให้อยู่ในรูปแบบลิสต์ได้ โดยในโปรแกรม R จะใช้ฟังก์ชัน list() ในการสร้างลิสต์ ดังตัวอย่างต่อไปนี้

list(1, 2, 3)
## [[1]]
## [1] 1
## 
## [[2]]
## [1] 2
## 
## [[3]]
## [1] 3
list(c(1, 2, 3))
## [[1]]
## [1] 1 2 3
list3 <- list(c(1, 2, 3), 1:5)

อาเรย์ (Array)

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

array(1:18, dim=c(3, 3, 2))
## , , 1
## 
##      [,1] [,2] [,3]
## [1,]    1    4    7
## [2,]    2    5    8
## [3,]    3    6    9
## 
## , , 2
## 
##      [,1] [,2] [,3]
## [1,]   10   13   16
## [2,]   11   14   17
## [3,]   12   15   18

การดำเนินการและฟังก์ชันทางคณิตศาสตร์เบื้องต้น

โปรแกรม R สามารถใช้งานเปรียบดังเครื่องคิดเลขทางวิทยาศาสตร์ ที่สามารถกระทำฟังก์ชันทางคณิตศาสตร์ได้ด้วยคำสั่งดังตาราง

ตัวอย่างการดำเนินการและฟังก์ชันทางคณิตศาสตร์ในโปรแกรม R
การดำเนินการ คำอธิบาย ตัวอย่าง
+ การบวก 1+2
- การลบ 25.4 - 12
* การคูณ 990 * 0.5
/ การหาร 150/2
^ หรือ ** การยกกำลัง 4^2 หรือ 4**4
4sqrt() การหารากที่สอง sqrt(144)
log() การหาลอการิทีม log(10) หรือ log(10, base = 10)
abs() การหาค่าสัมบูรณ์ abs(-5)
exp() การหาค่าชี้กำลัง exp(1) หรือ exp(log(1))
max() การหาค่าสูงสุด max(k2)
min() การหาค่าต่ำสุด min(k2)
round(x, n) การปัดเศษ round(212.2343, 2)

การอ่านและเขียนแฟ้มข้อมูล

โปรแกรม R สามารถอ่านแฟ้มข้อมูลที่ถูกเตรียมไว้แล้วจากโปรแกรมอื่น ๆ เช่น text, SPSS, SAS, Minitab, STATA, Excel เป็นต้น เข้ามาใช้งานได้โดยใช้ฟังก์ชันต่าง ๆ ดังนี้

การอ่านแฟ้มข้อมูลจากนามสกุลไฟล์ .txt

read.table("ระบุตำแหน่งแฟ้มข้อมูล.txt")

ตัวอย่าง

#dat1 <- read.table("D:/data1.txt",header=T)

การอ่านแฟ้มข้อมูลจากนามสกุลไฟล์ .csv

read.csv("ระบุตำแหน่งแฟ้มข้อมูล.csv")

ตัวอย่าง

#dat2 <- read.csv("data1.csv")

การอ่านแฟ้มข้อมูลจากนามสกุลไฟล์ .dat

read.delim("ระบุตำแหน่งแฟ้มข้อมูล.dat")

ตัวอย่าง

#dat3 <- read.delim("D:/data1.dat")

การเขียนแฟ้มข้อมูลนามสกุลไฟล์ .txt และ .csv

write.table(ชื่อตัวแปรหรือชุดข้อมูลที่ต้องการส่งออก, ระบุชื่อไฟล์ข้อมูล.txt")
write.csv(ชื่อตัวแปรหรือชุดข้อมูลที่ต้องการส่งออก, "ระบุชื่อไฟล์ข้อมูล.csv")

ตัวอย่าง

#write.table(k3, "seq_data.txt")

การเขียนฟังก์ชันใน R

ในโปรแกรม R สามารถเขียนฟังก์ชันขึ้นมาใช้งานได้ โดยที่ในการเขียนฟังก์ชันบนโปรแกรม R จะประกอบไปด้วย

function_name <- function(argument1, argument2, \ldots){

    process 1 
    process 2

return(object) #การส่งผลลัพธ์จากการกระทำในฟังก์ชัน
}

การกระทำแบบมีเงื่อนไข

If(เงื่อนไข) {

}

    การกระทำเมื่อเงื่อนไขเป็นจริง

} else{

}

    การกระทำเมื่อเงื่อนไขเป็นเท็จ
}

}

การทำซ้ำ

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

for(ตัวแปรระบุตำแหน่งข้อมูล in 1:จำนวนรอบที่ต้องการทำซ้ำ) {
    การกระทำ1
    การกระทำ2
}

ตัวอย่าง

data1 <- c(2,3,4,1,2)
data2 <- numeric() #สร้างตัวแปรมารองรับ
for(i in 1:length(data1)) {

  data2[i] = (data1[i] + 2)/data1[i]

}
data2
## [1] 2.000000 1.666667 1.500000 3.000000 2.000000

แต่เมื่อไม่ทราบจำนวนครั้งที่จะทำซ้ำหรือไม่ทราบจำนวน Loop ที่แน่นอนควรใช้ Repeat Loop ซึ่งจะทำซ้ำจนกระทั่งเงื่อนไขที่ต้องการนั้นเป็นจริง โดยมีโครงสร้างดังนี้

repeat{ 

   การกระทำ

   if(เงื่อนไข){

       break
     } #หยุดเมื่อเงื่อนไขเป็นจริง

    }

}

ตัวอย่าง

a<-1  #กำหหนดจุดเริ่มต้น

repeat{

    print(a)

  a <- a+1

 if(a>=5){
   
   break
   
 }

}
## [1] 1
## [1] 2
## [1] 3
## [1] 4

หรืออาจจะใช้ While Loop เมื่อต้องการทำซ้ำจนกระทั่งเงื่อนไขที่กำหนดเป็นเท็จ ดังตัวอย่างต่อไปนี้

b <- 1

while(b<5){

    print(b)

    b <- b+1

}
## [1] 1
## [1] 2
## [1] 3
## [1] 4

ตัวอย่าง การเขียนฟังก์ชันมวลความน่าจะเป็นสำหรับการแจกแจงปัวซง

pmf_Pois <- function(y, lambda){ #เริ่มต้นเขียนฟังก์ชัน

    pmf <- numeric()  #ประกาศตัวแปรสำหรับเก็บเวกเตอร์ของข้อมูล

    n <- length(y) #นับจำนวนข้อมูล

    if(lambda <= 0){ #ตรวจสอบเงื่อนไข 

        print("The lambda must be greater than zero")

} else {

        for(i in 1:n){

            pmf[i] <- exp(-lambda)*(lambda^x[i])/factorial(x[i])
              
            } #หาค่าความน่าจะเป็นสำหรับข้อมูลแต่ละตัว

            }

    return(pmf) #ส่งคืนเวกเตอร์ค่าความน่าจะเป็น

}

เมื่อสร้างฟังก์ชันขึ้นมาแล้วให้สั่งรันฟังก์ชันที่สร้างขึ้นมาก่อน จากนั้นจึงจะเรียกใช้ฟังก์ชันที่สร้างได้ ดังตัวอย่าง

pmf_Pois(5, lambda = 2)
## [1] 0.03608941

การวิเคราะห์ข้อมูลเชิงค้นหา

การวิเคราะห์ข้อมูลเชิงค้นห (Exploratory data analysis: EDA) ถือเป็นขั้นตอนหนึ่งที่สำคัญในการวิเคราะห์ข้อมูล โดยมีวัตถุประสงค์เพื่อตรวจสอบและทำความเข้าใจกับชุดข้อมูลที่มีอยู่ ซึ่งกระทำโดยการตรวจสอบประเภทของข้อมูล (Data type) การตรวจสอบค่าสูญหาย (Missing value) การตรวจสอบค่าผิดปกติ (Outlier) การตรวจสอบสหสัมพันธ์ระหว่างข้อมูล (Relationship) รวมถึงการจัดการกับข้อมูลสูญหาย ค่าผิดปกติ และการแปลงข้อมูล

การตรวจสอบข้อมูลเบื้องต้นสามารถใช้การมองภาพข้อมูล (Data visualization) โดยการสร้างกราฟเพื่อนำไปสู่การตรวจสอบข้อมูลด้วยสถิติเชิงพรรณนา (Descriptive statistics) ทั้งนี้ควรทราบก่อนว่า ข้อมูลที่ต้องการนำเสนอป็นข้อมูลปรเภทใด ข้อมูลเชิงปริมาณ (Quantitative data or numeric data) หรือข้อมูลเชิงคุณภาพ (Qualitative data) หรืออาจเรียกข้อมูลเชิงคุณภาพว่า ข้อมูลเชิงกลุ่ม (Categorical data) ก็ได้

สำหรับโปรแกม R มีคำสั่งในการพล็อตกราฟอยู่หลายคำสั่งด้วยกัน แต่ในที่นี้จะใช้คำสั่งที่อยู่ภายใต้แพ็กเกจ ggplot2 เป็นหลัก ซึ่งเป็นแพ็กเกจสำหรับการพล็อตกราฟโดยใช้ Grammar of Graphics

การมองภาพข้อมูลสำหรับตัวแปรเดียว

สำหรับข้อมูลเชิงกลุ่ม

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

ขั้นตอนที่ 1 ทำการติดตั้งแพ็กเกจและเรียกใช้แพ็กเกจที่จำเป็นสำหรับการจัดการข้อมูลและการสร้างกราฟต่าง ๆ

#install.packages(c('tidyverse','ggplot2', 'skimr','RCurl'))
library(tidyverse)
library(ggplot2)
library(skimr)

ขั้นตอนที่ 2 นำชุดข้อมูลที่ชื่อว่า windows_store.csv เข้ามาในพื้นที่การทำงานของโปรแกรม R

library(readr)
data1 <- read_csv("windows_store.csv")
head(data1)
## # A tibble: 6 x 6
##   Name                           Rating `No of people Rat~ Category Date   Price
##   <chr>                           <dbl>              <dbl> <chr>    <chr>  <chr>
## 1 Dynamic Reader                    3.5                268 Books    07-01~ Free 
## 2 Chemistry, Organic Chemistry ~    3                  627 Books    08-01~ Free 
## 3 BookViewer                        3.5                593 Books    29-02~ Free 
## 4 Brick Instructions                3.5                684 Books    30-01~ Free 
## 5 Introduction to Python Progra~    2                  634 Books    30-01~ Free 
## 6 Gurbani Reader                    4.5                399 Books    18-01~ Free

การตรวจสอบโครงสร้างของชุดข้อมูลที่นำเข้ามาในพื้นที่การทำงานของโปรแกรม R

str(data1)
## spec_tbl_df [5,322 x 6] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ Name              : chr [1:5322] "Dynamic Reader" "Chemistry, Organic Chemistry and Biochemistry-simpleNeasyApp by WAGmob" "BookViewer" "Brick Instructions" ...
##  $ Rating            : num [1:5322] 3.5 3 3.5 3.5 2 4.5 4.5 3 4 3.5 ...
##  $ No of people Rated: num [1:5322] 268 627 593 684 634 399 566 175 460 363 ...
##  $ Category          : chr [1:5322] "Books" "Books" "Books" "Books" ...
##  $ Date              : chr [1:5322] "07-01-2014" "08-01-2014" "29-02-2016" "30-01-2018" ...
##  $ Price             : chr [1:5322] "Free" "Free" "Free" "Free" ...
##  - attr(*, "spec")=
##   .. cols(
##   ..   Name = col_character(),
##   ..   Rating = col_double(),
##   ..   `No of people Rated` = col_double(),
##   ..   Category = col_character(),
##   ..   Date = col_character(),
##   ..   Price = col_character()
##   .. )

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

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

data1$Price = gsub("\u20b9", "", data1$Price)
data1$Price = gsub("[\\$,]", "", data1$Price)
str(data1)
## spec_tbl_df [5,322 x 6] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ Name              : chr [1:5322] "Dynamic Reader" "Chemistry, Organic Chemistry and Biochemistry-simpleNeasyApp by WAGmob" "BookViewer" "Brick Instructions" ...
##  $ Rating            : num [1:5322] 3.5 3 3.5 3.5 2 4.5 4.5 3 4 3.5 ...
##  $ No of people Rated: num [1:5322] 268 627 593 684 634 399 566 175 460 363 ...
##  $ Category          : chr [1:5322] "Books" "Books" "Books" "Books" ...
##  $ Date              : chr [1:5322] "07-01-2014" "08-01-2014" "29-02-2016" "30-01-2018" ...
##  $ Price             : chr [1:5322] "Free" "Free" "Free" "Free" ...
##  - attr(*, "spec")=
##   .. cols(
##   ..   Name = col_character(),
##   ..   Rating = col_double(),
##   ..   `No of people Rated` = col_double(),
##   ..   Category = col_character(),
##   ..   Date = col_character(),
##   ..   Price = col_character()
##   .. )

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

data <- data1 %>% 
  mutate(price = ifelse(Price=="Free", 0 , Price))

data$price <- as.numeric(data$price)
head(data)
## # A tibble: 6 x 7
##   Name                      Rating `No of people Ra~ Category Date   Price price
##   <chr>                      <dbl>             <dbl> <chr>    <chr>  <chr> <dbl>
## 1 Dynamic Reader               3.5               268 Books    07-01~ Free      0
## 2 Chemistry, Organic Chemi~    3                 627 Books    08-01~ Free      0
## 3 BookViewer                   3.5               593 Books    29-02~ Free      0
## 4 Brick Instructions           3.5               684 Books    30-01~ Free      0
## 5 Introduction to Python P~    2                 634 Books    30-01~ Free      0
## 6 Gurbani Reader               4.5               399 Books    18-01~ Free      0

แผนภูมิแท่ง

การสร้างแผนภูมิแท่งในโปรแกรม R สามารถทำได้โดยการเรียกใช้คำสั่ง barplot() แต่ในที่นี้จะขอยกตัวอย่างการสร้างแผนภูมิแท่งด้วยคำสั่ง ggplot() ที่อยู่ภายใต้แพ็กเกจ ggplot2 และใช้ฟังก์ชัน geom_bar()}

library(ggplot2)

bar <- ggplot(data, aes(x=Category)) +
  geom_bar()

print(bar)

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

bar <- ggplot(data, aes(x=Category)) +
  geom_bar(color="black", fill="steelblue") + 
  theme_minimal()
print(bar)

bar_flip <- ggplot(data, aes(x=Category, fill = Category )) + 
  geom_bar(color="black") + 
  coord_flip() + theme(legend.position="none")
print(bar_flip)

แผนภูมิวงกลม

การสร้างแผนภูมิวงกลมในโปรแกรม R สามารถทำได้โดยการเรียกใช้ฟังก์ชัน ggplot() ที่อยู่ภายใต้แพ็กเกจ ggplot2 และใช้ geom_bar() ร่วมกับคำสั่ง coord_polar() ซึ่งจะต้องทำการเตรียมข้อมูลที่จะนำไปสร้างแผนภูมิวงกลมก่อน โดยการหาตารางแจกแจงความถี่ของตัวแปรที่ต้องการนำไปสร้างแผนภูมิวงกลม ซึ่งในที้นี้จะสร้างแผนภูมิวงกลมเพื่อแสดงสัดส่วนของข้อมูลจำแนกตามกลุ่มของราคาว่า แจกฟรี (Free) หรือไม่ได้แจกฟรี (not_Free) จึงต้องทำการสร้างตัวแปรใหม่ที่ชื่อว่า price_group ภายใต้เงื่อนไขที่ว่า ถ้าตัวแปร Price เป็น Free จะให้อยู่ในกลุ่มแจกฟรีเช่นเดิม แต่ถ้าไม่ใช่จะให้ถูกจัดอยู่ในกลุ่มไม่แจกฟรี ดังนี้

new_data <- data1 %>%
  mutate(price_group = ifelse(Price =="Free", "Free", "not_Free"))
as_tibble(new_data)
## # A tibble: 5,322 x 7
##    Name                Rating `No of people R~ Category Date   Price price_group
##    <chr>                <dbl>            <dbl> <chr>    <chr>  <chr> <chr>      
##  1 Dynamic Reader         3.5              268 Books    07-01~ Free  Free       
##  2 Chemistry, Organic~    3                627 Books    08-01~ Free  Free       
##  3 BookViewer             3.5              593 Books    29-02~ Free  Free       
##  4 Brick Instructions     3.5              684 Books    30-01~ Free  Free       
##  5 Introduction to Py~    2                634 Books    30-01~ Free  Free       
##  6 Gurbani Reader         4.5              399 Books    18-01~ Free  Free       
##  7 NFO Viewer             4.5              566 Books    13-11~ Free  Free       
##  8 Text to Speech TTS     3                175 Books    17-10~ Free  Free       
##  9 ACK Comics             4                460 Books    20-12~ Free  Free       
## 10 Learn Biology and ~    3.5              363 Books    25-11~ Free  Free       
## # ... with 5,312 more rows

จากนั้นเตรียมชุดข้อมูลที่สร้างเป็นตารางแจกแจงความถี่ของตัวแปร price_group ด้วยคำสั่ง tally() ดังนี้

freq <- new_data %>%
  group_by(price_group) %>%
  tally()
freq
## # A tibble: 3 x 2
##   price_group     n
##   <chr>       <int>
## 1 Free         5163
## 2 not_Free      158
## 3 <NA>            1
freq <- freq |> drop_na()
freq
## # A tibble: 2 x 2
##   price_group     n
##   <chr>       <int>
## 1 Free         5163
## 2 not_Free      158

จากนั้นนำชุดข้อมูลที่อยู่ในรูปของตารางแจกแจงความถี่ไปสร้างแผนภูมิวงกลมด้วยคำสั่งต่อไปนี้

pie <- ggplot(freq, aes(x=" " , y = n, fill = price_group)) + 
  geom_bar(stat = "identity") +
  coord_polar("y") +
  labs(title = "Pie Chart of Price") +
  theme_minimal() 
print(pie)

นอกจากนี้ยังสามารถปรับแต่งแผนภูมิวงกลมโดยการเพิ่มป้ายกำกับร้อยละของ application จำแนกตามกลุ่มของราคาได้ ดังตัวอย่างต่อไปนี้

library(scales)

pie_chart <- pie +
  theme(axis.text.x = element_blank()) +
  geom_text(aes(y = n/2 + c(0,cumsum(n)[-length(n)]), label = percent(n/100)), size = 5)

print(pie_chart)

สำหรับข้อมูลเชิงปริมาณ

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

ฮิสโทแกรม (Histograms)

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

hist <- ggplot(new_data, aes(Rating)) + 
  geom_histogram(binwidth = 0.5, color= "black", fill = "red")
print(hist)
## Warning: Removed 1 rows containing non-finite values (stat_bin).

จากฮิสโทแกรมข้างต้นจะทราบว่า รูปร่างการแจกแจงของการให้คะแนน application ไม่สมมาตร โดยมีลักษณะเบ้ซ้ายอย่างเห็นได้ชัด และน่าจะมีการกระจายสูง

แผนภาพกล่อง (Boxplot)

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

boxp <- ggplot(new_data, aes(y= Rating)) + 
  geom_boxplot()
print(boxp)
## Warning: Removed 1 rows containing non-finite values (stat_boxplot).

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

boxp_group <- ggplot(new_data, aes(x= price_group,y= Rating, fill= price_group)) + geom_boxplot()
print(boxp_group)
## Warning: Removed 1 rows containing non-finite values (stat_boxplot).

จากแผนภาพกล่อง จะทำให้ทราบว่าการให้คะแนนในกลุ่มราคาฟรี มีการกระจายน้อยกว่าในกลุ่มไม่ฟรี แต่ในกลุ่มราคาฟรีมีค่าผิดปกติรวมอยู่ด้วย 2 ค่า นอกจากนี้ยังทำให้ทราบว่า ในกลุ่มราคาฟรีส่วนใหญ่มีการให้คะแนนค่อนข้างสูงกว่ากลุ่มราคาไม่ฟรี

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

boxp_cate <- ggplot(new_data %>% filter(price_group=="Free"), aes(x= Category, y= Rating, fill= Category)) + geom_boxplot() 
print(boxp_cate)

การมองภาพข้อมูลสำหรับ 2 ตัวแปร

แผนภาพกระจาย (Scatter plot)

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

scatt <- ggplot(new_data, aes(x = Price, y = Rating)) + geom_point()
print(scatt)
## Warning: Removed 1 rows containing missing values (geom_point).

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

แหล่งศึกษาค้นคว้าเพิ่มเติมสำหรับการสร้างกราฟด้วยแพ็กเกจ ggplot2

http://www.sthda.com/english/wiki/ggplot2-barplots-quick-start-guide-r-software-and-data-visualization

การตรวจสอบข้อมูลเบื้องต้นด้วยแพ็กเกจ DataExplorer

library(DataExplorer)
plot_intro(new_data)

plot_bar(new_data)
## 2 columns ignored with more than 50 categories.
## Name: 5318 categories
## Date: 2125 categories

plot_correlation(new_data)
## 3 features with more than 20 categories ignored!
## Name: 5318 categories
## Date: 2125 categories
## Price: 45 categories
## Warning: Removed 36 rows containing missing values (geom_text).

plot_density(new_data)

สถิติเชิงพรรณนา

ในหัวข้อนี้จะกล่าวถึงการวิเคราะห์ข้อมูลด้วยสถิติพื้นฐานหรือการนำเสนอข้อมูลขั้นต้นด้วยค่าสถิติเชิงพรรณนาโดยใช้คำสั่งในโปรแกรม R เช่น การหาค่าเฉลี่ยเลขคณิต (Mean) มัธยฐาน (Median) ฐานนิยม (Mode) ส่วนเบี่ยงเบนมาตรฐาน (Standard deviation; sd.) ความแปรปรวน (Variance) พิสัย (Range) ส่วนเบี่ยงเบนควอร์ไทล์ (Quartile deviation; Q.D.) เป็นต้น

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

summary(`dataset')

ตัวอย่างการหาค่าสถิติเบื้องต้น

summary(new_data)
##      Name               Rating      No of people Rated   Category        
##  Length:5322        Min.   :1.000   Min.   : 100.0     Length:5322       
##  Class :character   1st Qu.:3.500   1st Qu.: 327.0     Class :character  
##  Mode  :character   Median :4.000   Median : 548.0     Mode  :character  
##                     Mean   :3.793   Mean   : 551.9                       
##                     3rd Qu.:4.500   3rd Qu.: 779.0                       
##                     Max.   :5.000   Max.   :1000.0                       
##                     NA's   :1                                            
##      Date              Price           price_group       
##  Length:5322        Length:5322        Length:5322       
##  Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character  
##                                                          
##                                                          
##                                                          
## 

ผลลัพธ์ที่ได้จะแสดงค่าต่ำสุด (Minimum value) ค่าควอร์ไทล์ตำแหน่งที่ 1 (First quartile)

ค่ามัธยฐาน (Median) ค่าเฉลี่ย (Mean) ค่าควอร์ไทล์ตำแหน่งที่ 3 (Third quartile) และค่าสูงสุด (Maximum) ของข้อมูลทุกตัวแปรในชุดข้อมูลนั้น ๆ ดังต่อไปนี้

หรือใช้คำสั่ง skim() ที่อยู่ภายใต้แพ็กเกจ skimr ดังตัวอย่าง

#library(skimr)
#skim(new_data)

การจัดการข้อมูลเบื้องต้น

ในการวิเคราะห์ข้อมูลบางครั้งต้องมีการจัดการกับข้อมูลก่อน การจัดการข้อมูลในที่นี้อาจเป็นการรวมชุดข้อมูลหรือการปรับรูปแบบของชุดข้อมูล โดยเป็นการปรับเปลี่ยนทิศทางของข้อมูลให้อยู่ในแถวและสดมภ์ให้เหมาะสมกับการนำข้อมูลไปวิเคราะห์ด้วยกระบวนวิธีต่าง ๆ เนื่องจากการวิเคราะห์ข้อมูลบางกระบวนวิธีต้องการข้อมูลเข้าในรูปแบบที่แตกต่างกันโปรแกรม R มีแพ็กเกจ และฟังก์ชันมากมายในการจัดการข้อมูลทั้งการแยกข้อมูล การรวมข้อมูล หรือปรับเปลี่ยนทิศทางข้อมูลให้อยู่ในรูปแบบกว้าง (Wide format) หรือแบบยาว (Long format)

การจัดการข้อมูลสูญหาย (Missing Value)

โปรแกรม R จะใช้ “NA” แทนข้อมูลสูญหาย ในการจัดการกับข้อมูลสูญหายสามารถทำได้โดยการแทนที่ข้อมูลสูญหายด้วยตัวเลขใดตัวเลขหนึ่งหรือทำการลบข้อมูลของหน่วยตัวอย่างที่มีข้อมูลสูญหายออกทุกตัวแปร

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

library(readr)
covid <- read_csv("covid.csv")
plot_intro(covid)

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

dat2 = na.omit(covid)
plot_intro(dat2)

age_mean <-mean(covid$age, na.rm = T)
  
new_covid <- transform(covid, age = ifelse(is.na(age), age_mean, age)) 
new_covid |> 
  head()
##   X1    No. announce_date Notified.date                              sex age
## 1  1 159739    2021-06-01    2021-05-31 <U+0E2B><U+0E0D><U+0E34><U+0E07>  65
## 2  2 159740    2021-06-01    2021-05-31 <U+0E2B><U+0E0D><U+0E34><U+0E07>  25
## 3  3 159741    2021-06-01    2021-05-31 <U+0E2B><U+0E0D><U+0E34><U+0E07>  59
## 4  4 159742    2021-06-01    2021-05-31 <U+0E2B><U+0E0D><U+0E34><U+0E07>  36
## 5  5 159743    2021-06-01    2021-05-31 <U+0E2B><U+0E0D><U+0E34><U+0E07>  13
## 6  6 159744    2021-06-01    2021-05-31 <U+0E2B><U+0E0D><U+0E34><U+0E07>  12
##               Unit nationality
## 1 <U+0E1B><U+0E35>    Thailand
## 2 <U+0E1B><U+0E35>    Thailand
## 3 <U+0E1B><U+0E35>    Thailand
## 4 <U+0E1B><U+0E35>    Thailand
## 5 <U+0E1B><U+0E35>    Thailand
## 6 <U+0E1B><U+0E35>    Thailand
##                                                      province_of_isolation
## 1 <U+0E40><U+0E0A><U+0E35><U+0E22><U+0E07><U+0E43><U+0E2B><U+0E21><U+0E48>
## 2 <U+0E40><U+0E0A><U+0E35><U+0E22><U+0E07><U+0E43><U+0E2B><U+0E21><U+0E48>
## 3         <U+0E40><U+0E0A><U+0E35><U+0E22><U+0E07><U+0E23><U+0E32><U+0E22>
## 4 <U+0E2D><U+0E38><U+0E15><U+0E23><U+0E14><U+0E34><U+0E15><U+0E16><U+0E4C>
## 5 <U+0E2D><U+0E38><U+0E15><U+0E23><U+0E14><U+0E34><U+0E15><U+0E16><U+0E4C>
## 6 <U+0E2D><U+0E38><U+0E15><U+0E23><U+0E14><U+0E34><U+0E15><U+0E16><U+0E4C>
##                                                                                                                                                                                                                                                                                                                                                       risk
## 1                                                                                                                                                                                                                                                                         <U+0E23><U+0E30><U+0E1A><U+0E38><U+0E44><U+0E21><U+0E48><U+0E44><U+0E14><U+0E49>
## 2                                                                                                                                                                                         <U+0E2D><U+0E22><U+0E39><U+0E48><U+0E23><U+0E30><U+0E2B><U+0E27><U+0E48><U+0E32><U+0E07><U+0E01><U+0E32><U+0E23><U+0E2A><U+0E2D><U+0E1A><U+0E2A><U+0E27><U+0E19>
## 3                                                                                                 <U+0E1A><U+0E38><U+0E04><U+0E25><U+0E32><U+0E01><U+0E23><U+0E14><U+0E49><U+0E32><U+0E19><U+0E01><U+0E32><U+0E23><U+0E41><U+0E1E><U+0E17><U+0E22><U+0E4C><U+0E41><U+0E25><U+0E30><U+0E2A><U+0E32><U+0E18><U+0E32><U+0E23><U+0E13><U+0E2A><U+0E38><U+0E02>
## 4 <U+0E2A><U+0E31><U+0E21><U+0E1C><U+0E31><U+0E2A><U+0E43><U+0E01><U+0E25><U+0E49><U+0E0A><U+0E34><U+0E14><U+0E01><U+0E31><U+0E1A><U+0E1C><U+0E39><U+0E49><U+0E1B><U+0E48><U+0E27><U+0E22><U+0E22><U+0E37><U+0E19><U+0E22><U+0E31><U+0E19><U+0E23><U+0E32><U+0E22><U+0E01><U+0E48><U+0E2D><U+0E19><U+0E2B><U+0E19><U+0E49><U+0E32><U+0E19><U+0E35><U+0E49>
## 5 <U+0E2A><U+0E31><U+0E21><U+0E1C><U+0E31><U+0E2A><U+0E43><U+0E01><U+0E25><U+0E49><U+0E0A><U+0E34><U+0E14><U+0E01><U+0E31><U+0E1A><U+0E1C><U+0E39><U+0E49><U+0E1B><U+0E48><U+0E27><U+0E22><U+0E22><U+0E37><U+0E19><U+0E22><U+0E31><U+0E19><U+0E23><U+0E32><U+0E22><U+0E01><U+0E48><U+0E2D><U+0E19><U+0E2B><U+0E19><U+0E49><U+0E32><U+0E19><U+0E35><U+0E49>
## 6 <U+0E2A><U+0E31><U+0E21><U+0E1C><U+0E31><U+0E2A><U+0E43><U+0E01><U+0E25><U+0E49><U+0E0A><U+0E34><U+0E14><U+0E01><U+0E31><U+0E1A><U+0E1C><U+0E39><U+0E49><U+0E1B><U+0E48><U+0E27><U+0E22><U+0E22><U+0E37><U+0E19><U+0E22><U+0E31><U+0E19><U+0E23><U+0E32><U+0E22><U+0E01><U+0E48><U+0E2D><U+0E19><U+0E2B><U+0E19><U+0E49><U+0E32><U+0E19><U+0E35><U+0E49>
##                                                          province_of_onset
## 1 <U+0E40><U+0E0A><U+0E35><U+0E22><U+0E07><U+0E43><U+0E2B><U+0E21><U+0E48>
## 2 <U+0E40><U+0E0A><U+0E35><U+0E22><U+0E07><U+0E43><U+0E2B><U+0E21><U+0E48>
## 3         <U+0E40><U+0E0A><U+0E35><U+0E22><U+0E07><U+0E23><U+0E32><U+0E22>
## 4 <U+0E2D><U+0E38><U+0E15><U+0E23><U+0E14><U+0E34><U+0E15><U+0E16><U+0E4C>
## 5 <U+0E2D><U+0E38><U+0E15><U+0E23><U+0E14><U+0E34><U+0E15><U+0E16><U+0E4C>
## 6 <U+0E2D><U+0E38><U+0E15><U+0E23><U+0E14><U+0E34><U+0E15><U+0E16><U+0E4C>
##                                                                                                  district_of_onset
## 1                                                         <U+0E2A><U+0E31><U+0E19><U+0E17><U+0E23><U+0E32><U+0E22>
## 2 <U+0E40><U+0E21><U+0E37><U+0E2D><U+0E07><U+0E40><U+0E0A><U+0E35><U+0E22><U+0E07><U+0E43><U+0E2B><U+0E21><U+0E48>
## 3                                                                                 <U+0E40><U+0E17><U+0E34><U+0E07>
## 4                                                                         <U+0E1E><U+0E34><U+0E0A><U+0E31><U+0E22>
## 5                                                                         <U+0E1E><U+0E34><U+0E0A><U+0E31><U+0E22>
## 6                                                                         <U+0E1E><U+0E34><U+0E0A><U+0E31><U+0E22>

การจัดการข้อมูลซ้ำ

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

mydata <- c(1,2,2,2,3,3,4,5)
unique(mydata)
## [1] 1 2 3 4 5

หรือใช้ฟังก์ชัน !duplicated() ดังตัวอย่าง

mydata[!duplicated(mydata)]
## [1] 1 2 3 4 5

การตรวจสอบหน่วยข้อมูลที่ค่าข้อมูลซ้ำกันจะใช้ฟังก์ชัน duplicated() ดังนี้

mydata[duplicated(mydata)]
## [1] 2 2 3

หากต้องการลบข้อมูลที่มีการซ้ำกันออกจะสามารถทำได้โดยการประยุกต์ใช้คำสั่ง !duplicated()

mydata <- mydata[!duplicated(mydata)]
mydata
## [1] 1 2 3 4 5

การตรวจสอบตำแหน่งข้อมูล

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

library(MASS)
## 
## Attaching package: 'MASS'
## The following object is masked from 'package:dplyr':
## 
##     select
attach(Aids2)
which(age <= 20)
##  [1]   26   30  116  137  170  272  273  274  431  491  577  646  660  760  764
## [16]  933  934  935 1053 1142 1274 1278 1367 1431 1482 1789 1790 1791 1794 1816
## [31] 1829 1895 1941 1965 1993 2022 2079 2116 2278 2300 2482 2483 2516 2523 2615
## [46] 2811
Aids2[which(age<=20),]
##      state sex  diag death status T.categ age
## 26     NSW   M 11056 11504      A    haem  13
## 30     NSW   M 11289 11504      A  mother   1
## 116    NSW   M  9167  9492      D   blood  16
## 137    NSW   M  9514  9812      D      hs  20
## 170    NSW   F  9265  9525      D   blood  17
## 272    NSW   M  9740  9748      D      hs  20
## 273    NSW   M  9362  9362      D   blood  12
## 274    NSW   M  8945  8945      D   blood  11
## 431    NSW   M  9436 10938      D   blood   3
## 491    NSW   M 10167 10563      D    hsid  20
## 577    NSW   F 10291 11504      A   blood   5
## 646    NSW   F 10482 11115      D      id  18
## 660    NSW   M 10399 11390      D    haem  20
## 760    NSW   M 10528 11504      A   blood  18
## 764    NSW   F 10584 11238      D  mother   5
## 933    NSW   M 10597 11504      A   blood   5
## 934    NSW   M 10767 11504      A  mother   3
## 935    NSW   M 10688 10944      D    haem  15
## 1053   NSW   M 10751 10982      D    haem  15
## 1142   NSW   M 10939 11380      D      hs  20
## 1274   NSW   M 10988 11491      A    haem  16
## 1278   NSW   M 10942 11034      D    haem  14
## 1367   NSW   M 11060 11504      A    haem  18
## 1431   NSW   M 10702 11504      A      hs  20
## 1482   NSW   M  9051 11504      A   blood  16
## 1789   QLD   M  9023  9039      D   blood   0
## 1790   QLD   M  8963  8979      D   blood   0
## 1791   QLD   M  9199  9215      D   blood   1
## 1794   QLD   M  8815  8815      D   blood   0
## 1816   QLD   M  9868  9881      D   blood   3
## 1829   QLD   M 10039 10862      A      hs  20
## 1895   QLD   M 10545 10884      D    haem  19
## 1941   QLD   F 11306 11504      A  mother   6
## 1965   QLD   M 11333 11392      D      hs  17
## 1993   QLD   M 11402 11504      A    haem  12
## 2022 Other   F  9447  9447      D  mother   0
## 2079 Other   M 11061 11504      A  mother   6
## 2116 Other   M  9968 10333      D    haem   9
## 2278   VIC   M 10373 11029      D    haem  12
## 2300   VIC   M 10336 10719      D      hs  19
## 2482   VIC   M 10851 11239      D    haem  14
## 2483   VIC   F 10815 11504      A   blood  17
## 2516   VIC   M 11114 11504      A    haem  15
## 2523   VIC   M 11091 11504      A    haem  12
## 2615   VIC   F 11312 11327      D  mother   1
## 2811 Other   M 11087 11088      D    haem  12
Aids2[age<=20,]
##      state sex  diag death status T.categ age
## 26     NSW   M 11056 11504      A    haem  13
## 30     NSW   M 11289 11504      A  mother   1
## 116    NSW   M  9167  9492      D   blood  16
## 137    NSW   M  9514  9812      D      hs  20
## 170    NSW   F  9265  9525      D   blood  17
## 272    NSW   M  9740  9748      D      hs  20
## 273    NSW   M  9362  9362      D   blood  12
## 274    NSW   M  8945  8945      D   blood  11
## 431    NSW   M  9436 10938      D   blood   3
## 491    NSW   M 10167 10563      D    hsid  20
## 577    NSW   F 10291 11504      A   blood   5
## 646    NSW   F 10482 11115      D      id  18
## 660    NSW   M 10399 11390      D    haem  20
## 760    NSW   M 10528 11504      A   blood  18
## 764    NSW   F 10584 11238      D  mother   5
## 933    NSW   M 10597 11504      A   blood   5
## 934    NSW   M 10767 11504      A  mother   3
## 935    NSW   M 10688 10944      D    haem  15
## 1053   NSW   M 10751 10982      D    haem  15
## 1142   NSW   M 10939 11380      D      hs  20
## 1274   NSW   M 10988 11491      A    haem  16
## 1278   NSW   M 10942 11034      D    haem  14
## 1367   NSW   M 11060 11504      A    haem  18
## 1431   NSW   M 10702 11504      A      hs  20
## 1482   NSW   M  9051 11504      A   blood  16
## 1789   QLD   M  9023  9039      D   blood   0
## 1790   QLD   M  8963  8979      D   blood   0
## 1791   QLD   M  9199  9215      D   blood   1
## 1794   QLD   M  8815  8815      D   blood   0
## 1816   QLD   M  9868  9881      D   blood   3
## 1829   QLD   M 10039 10862      A      hs  20
## 1895   QLD   M 10545 10884      D    haem  19
## 1941   QLD   F 11306 11504      A  mother   6
## 1965   QLD   M 11333 11392      D      hs  17
## 1993   QLD   M 11402 11504      A    haem  12
## 2022 Other   F  9447  9447      D  mother   0
## 2079 Other   M 11061 11504      A  mother   6
## 2116 Other   M  9968 10333      D    haem   9
## 2278   VIC   M 10373 11029      D    haem  12
## 2300   VIC   M 10336 10719      D      hs  19
## 2482   VIC   M 10851 11239      D    haem  14
## 2483   VIC   F 10815 11504      A   blood  17
## 2516   VIC   M 11114 11504      A    haem  15
## 2523   VIC   M 11091 11504      A    haem  12
## 2615   VIC   F 11312 11327      D  mother   1
## 2811 Other   M 11087 11088      D    haem  12

การรวมชุดข้อมูล

การรวมชุดข้อมูลมากกว่า 1 ชุดข้อมูลเข้าด้วยกัน โดยที่ภายในชุดข้อมูลที่จะนำมารวมกันต้องมีชื่อสดมภ์ที่เหมือนกันจึงจะสามารรวมได้ ซึ่งการรวมชุดข้อมูลใน R สามารถกระทำได้โดยเรียกใช้ฟังก์ชัน merge() ที่ถูกเตรียมไว้แล้วในแพ็กเกจ MASS

ตัวอย่างต่อไปนี้จะเรียกใช้ชุดข้อมูลเกี่ยวกับข้อมูลโรคเบาหวานในผู้หญิงเมือง Pima ประเทศอินเดีย ซึ่งถูกเตรียมไว้แล้วในแพ็กเกจ MASS ข้อมูลดังกล่าวถูกเก็บไว้ใน 3 ชุดข้อมูลด้วยกัน ดังนี้

ชุดข้อมูล คำอธิบายเบื้องต้น

Pima.te Diabetes in Pima Indian Women 332 subjects

Pima.tr Diabetes in Pima Indian Women 200 subjects

Pima.tr2 Diabetes in Pima Indian Women with missing values

ข้อมูลทั้ง 3 ชุดประกอบไปด้วยตัว 8 ตัวแปรเหมือนกัน ในตัวอย่างนี้ต้องการรวมข้อมูลจากชุดข้อมูล Pima.te และ Pimta.tr เข้าด้วยกัน โดยที่รวมจากระดับความดันโลหิต (bp) และดัชนีมวลกาย (bmi) ในการรวมชุดข้อมูลจากข้อมูลใน 2 สดมภ์หรือตัวแปรดังกล่าวจะรวมหน่วยข้อมูลที่มีค่าของตัวแปรทั้ง 2 ที่เข้าคู่กันให้อยู่ในเพียงชุดข้อมูลเดียวกัน

library(MASS)
Pima.merge <- merge(x = Pima.te, y = Pima.tr, by.x = c('bp', 'bmi'), by.y = c('bp', 'bmi')) #merge two data sets

การปรับทิศทางของชุดข้อมูล

การปรับทิศทางหรือรูปแบบของชุดข้อมูลใน R สามารถกระทำได้โดยใช้ฟังก์ชัน melt() และ dcast()

เราพิจารณาชุดข้อมูล ships ที่ถูกเตรียมไว้แล้วในแพ็กเกจ MASS ซึ่งถูกเตรียมไว้อยู่ในรูปแบบทางกว้าง (Wide format) เราต้องการเปลี่ยนให้ข้อมูลอยู่ในรูปแบบทางยาว (Long format) ด้วยฟังก์ชัน melt() ในแพ็กเกจ reshape2 โดยให้ปรับตามตัวแปร type และ year

data(ships)
attach(ships)
library(reshape2)
## 
## Attaching package: 'reshape2'
## The following object is masked from 'package:tidyr':
## 
##     smiths
ships.long <- melt(ships, id = c("type","year"))
head(ships.long)
##   type year variable value
## 1    A   60   period    60
## 2    A   60   period    75
## 3    A   65   period    60
## 4    A   65   period    75
## 5    A   70   period    60
## 6    A   70   period    75

การเปลี่ยนที่อยู่ในรูปแบบทางยาวให้อยู่ในรูปแบบทางกว้าง สามารถกระทำได้ด้วยฟังก์ชัน dcast() ในแพ็กเกจ reshape2 โดยให้ปรับตามตัวแปร type และ year จำแนกตามตัวแปร

ships.wide <- dcast(ships.long, type+year~variable,sum)
head(ships.wide)
##   type year period service incidents
## 1    A   60    135     190         0
## 2    A   65    135    2190         7
## 3    A   70    135    4865        24
## 4    A   75    135    2244        11
## 5    B   60    135   62058        68
## 6    B   65    135   48979       111

Pipe operator สำหรับการจัดการข้อมูล

ในโปรแกรม R มีสัญลักษณ์พิเศษอยู่หนึ่งตัวที่เป็นประโยชน์ในการจัดการข้อมูลและเขียนเรียกใช้ฟังก์ชันอย่างมาก นั่นคือ %>\% โดยจะเรียกใช้สัญลักษณ์พิเศษนี้ได้จะต้องติดตั้งและเรียกใช้แพ็กเกจ magrittr ซึ่งถูกพัฒนาโดย Stefan Milton Bache ในปีค.ศ. 2014 แต่ปัจจุบันมักจะถูกเรียกใช้ผ่านแพ็กเกจ dplyr หรือแพ็กเกจ tidyverse หรือสามารถใช้ pipe operator ที่อยู่ในแพ็กเกจพื้นฐานของโปรแกรม R นั่นคือ |> โดยรูปแบบการเรียกใช้งานคือ

dataset %>% 
        function

ดังตัวอย่างการเรียกดูเฉพาะข้อมูลส่วนหัวของชุดข้อมูล iris ดังต่อไปนี้

library(tidyverse)
iris %>%
  head()
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          5.1         3.5          1.4         0.2  setosa
## 2          4.9         3.0          1.4         0.2  setosa
## 3          4.7         3.2          1.3         0.2  setosa
## 4          4.6         3.1          1.5         0.2  setosa
## 5          5.0         3.6          1.4         0.2  setosa
## 6          5.4         3.9          1.7         0.4  setosa

การเลือกตัวแปร (Select variable)

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

iris %>%
  dplyr::select(Species, Sepal.Length)  %>%
  head()
##   Species Sepal.Length
## 1  setosa          5.1
## 2  setosa          4.9
## 3  setosa          4.7
## 4  setosa          4.6
## 5  setosa          5.0
## 6  setosa          5.4
iris %>% 
  select_if(is.numeric) %>%
  head()
##   Sepal.Length Sepal.Width Petal.Length Petal.Width
## 1          5.1         3.5          1.4         0.2
## 2          4.9         3.0          1.4         0.2
## 3          4.7         3.2          1.3         0.2
## 4          4.6         3.1          1.5         0.2
## 5          5.0         3.6          1.4         0.2
## 6          5.4         3.9          1.7         0.4
iris %>% 
  select_if(is.numeric) %>% #select the numerical variable
  summary()
##   Sepal.Length    Sepal.Width     Petal.Length    Petal.Width   
##  Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100  
##  1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300  
##  Median :5.800   Median :3.000   Median :4.350   Median :1.300  
##  Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199  
##  3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800  
##  Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500

การกรองข้อมูล (Filtering data)

การกรองข้อมูล เพื่อต้องการเฉพาะแถวหรือหน่วยของข้อมูลที่เป็นไปตามที่ต้องการ เช่น ต้องการ Sepal.Width ที่มีค่าน้อยกว่า 2.5 สามารถทำได้โดยใช้ฟังก์ชัน filter() ดังตัวอย่าง

iris %>%
  filter(Sepal.Width<2.5)
##    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
## 1           4.5         2.3          1.3         0.3     setosa
## 2           5.5         2.3          4.0         1.3 versicolor
## 3           4.9         2.4          3.3         1.0 versicolor
## 4           5.0         2.0          3.5         1.0 versicolor
## 5           6.0         2.2          4.0         1.0 versicolor
## 6           6.2         2.2          4.5         1.5 versicolor
## 7           5.5         2.4          3.8         1.1 versicolor
## 8           5.5         2.4          3.7         1.0 versicolor
## 9           6.3         2.3          4.4         1.3 versicolor
## 10          5.0         2.3          3.3         1.0 versicolor
## 11          6.0         2.2          5.0         1.5  virginica

การเรียงลำดับข้อมูล (Arrange data)

การเรียงลำดับของข้อมูลจากค่าน้อยที่สุดไปหาค่ามากที่สุด หรือเรียงลำดับจากค่ามากที่สุดไปหาค่าน้อยที่สุด เช่น การเรียงลำดับจากค่าน้อยที่สุดไปหาค่ามากที่สุดของตัวแปร Sepal.Length สามารถทำได้โดยใช้ฟังก์ชัน arrange() ดังตัวอย่าง

iris %>%
  arrange(Sepal.Length) %>%
  head()
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          4.3         3.0          1.1         0.1  setosa
## 2          4.4         2.9          1.4         0.2  setosa
## 3          4.4         3.0          1.3         0.2  setosa
## 4          4.4         3.2          1.3         0.2  setosa
## 5          4.5         2.3          1.3         0.3  setosa
## 6          4.6         3.1          1.5         0.2  setosa

การสร้างตัวแปรใหม่ (Mutate)

การสร้างตัวแปรใหม่ หรืออาจเรียกว่าการแปลงข้อมูล (Transform data) เช่น การสร้างตัวแปรใหม่ชื่อ diff1 ที่เก็บค่าข้อมูลย้อนหลัง (Lag) ของข้อมูลในตัวแปร Sepal.Length สามารถทำได้โดยใช้ฟังก์ชัน mutate ดังตัวอย่าง

 iris %>%
   mutate(diff1 = lag(Sepal.Length)) %>%
   head()
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species diff1
## 1          5.1         3.5          1.4         0.2  setosa    NA
## 2          4.9         3.0          1.4         0.2  setosa   5.1
## 3          4.7         3.2          1.3         0.2  setosa   4.9
## 4          4.6         3.1          1.5         0.2  setosa   4.7
## 5          5.0         3.6          1.4         0.2  setosa   4.6
## 6          5.4         3.9          1.7         0.4  setosa   5.0

การจัดกลุ่มข้อมูล (Grouped data)

การจัดกลุ่มข้อมูล เพื่อนำเสนอ สร้างชุดข้อมูลใหม่ หรือ จัดทำข้อสรุปของข้อมูล โดยการจำแนกตามข้อมูลจำแนกประเภทบางตัวแปรที่สนใจ เช่น ต้องการหาส่วนเบี่ยงเบนมาตรฐานของตัวแปร Sepal.Width เก็บไว้ในตัวแปร sd_sepalW จำแนกตาม Species ดังตัวอย่าง

iris %>%
  group_by(Species) %>%
  summarise(sd_sepalW=sd(Sepal.Width))
## # A tibble: 3 x 2
##   Species    sd_sepalW
##   <fct>          <dbl>
## 1 setosa         0.379
## 2 versicolor     0.314
## 3 virginica      0.322