โปรแกรม 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 เวอร์ชัน 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 เป็นฟรีแวร์ที่สามารถดาวน์โหลดตัวติดตั้งได้จากเว็บไซต์ 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 มีหลายประเภทด้วยกัน ดังตัวอย่างในตาราง
ประเภทข้อมูล | คำอธิบาย | ตัวอย่าง |
---|---|---|
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 เป็นภาษาที่ทำงานในเชิง 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(เวกเตอร์ข้อมูล, 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
ในการหามิติของเมทริกซ์ว่ามีจำนวนกี่แถวและกี่หลักจะหาได้จากการใช้ฟังก์ชัน dim() ดังนี้
dim(m)
## [1] 4 5
ในการสลับแถวและหลักของเมทริกซ์ใด ๆ จะทำได้โดยการเรียกใช้ฟังก์ชัน t() ดังนี้
tm <- t(m)
ในการหาผลคูณของเมทริกซ์จะหาได้จากการใช้เครื่องหมาย % * % ดังนี้
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
แฟ้มข้อมูลในโปรแกรม 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
ในการสร้างชุดข้อมูลที่ประกอบไปด้วยข้อมูลหลายประเภทอาจจะสร้างชุดข้อมูลให้อยู่ในรูปแบบลิสต์ได้ โดยในโปรแกรม 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(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 สามารถใช้งานเปรียบดังเครื่องคิดเลขทางวิทยาศาสตร์ ที่สามารถกระทำฟังก์ชันทางคณิตศาสตร์ได้ด้วยคำสั่งดังตาราง
การดำเนินการ | คำอธิบาย | ตัวอย่าง |
---|---|---|
+ | การบวก | 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 เป็นต้น เข้ามาใช้งานได้โดยใช้ฟังก์ชันต่าง ๆ ดังนี้
read.table("ระบุตำแหน่งแฟ้มข้อมูล.txt")
ตัวอย่าง
#dat1 <- read.table("D:/data1.txt",header=T)
read.csv("ระบุตำแหน่งแฟ้มข้อมูล.csv")
ตัวอย่าง
#dat2 <- read.csv("data1.csv")
read.delim("ระบุตำแหน่งแฟ้มข้อมูล.dat")
ตัวอย่าง
#dat3 <- read.delim("D:/data1.dat")
write.table(ชื่อตัวแปรหรือชุดข้อมูลที่ต้องการส่งออก, ระบุชื่อไฟล์ข้อมูล.txt")
write.csv(ชื่อตัวแปรหรือชุดข้อมูลที่ต้องการส่งออก, "ระบุชื่อไฟล์ข้อมูล.csv")
ตัวอย่าง
#write.table(k3, "seq_data.txt")
ในโปรแกรม 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) เพื่อให้เห็นถึงรูปร่างการแจกแจงของข้อมูล การกระจายของข้อมูล รวมถึงค่าที่ผิดปกติอีกด้วย
ฮิสโทแกรม เป็นแผนภาพที่ใช้สำหรับดูการแจกแจงของข้อมูลเชิงปริมาณโดยสามารถดูได้ว่าข้อมูลสมมาตรหรือมีความเบ้ หากต้องการสร้างฮิสโทแกรมสามารถทำได้โดยใช้คำสั่งต่อไปนี้
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 ไม่สมมาตร โดยมีลักษณะเบ้ซ้ายอย่างเห็นได้ชัด และน่าจะมีการกระจายสูง
แผนภาพกล่อง เป็นแผนภาพที่ใช้สำหรับดูลักษณะการกระจายของข้อมูลเชิงปริมาณเช่นเดียวกันกับฮิสโทแกรม โดยสามารถดูได้ว่าข้อมูลสมมาตรหรือมีลักษณะเบ้ การสร้างแผนภาพกล่องสามารถทำได้โดใช้คำสั่งต่อไปนี้
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 ตัว สามารถสร้างได้โดยใช้คำสั่ง
scatt <- ggplot(new_data, aes(x = Price, y = Rating)) + geom_point()
print(scatt)
## Warning: Removed 1 rows containing missing values (geom_point).
จากแผนภาพกระจาย ทำให้ทราบได้เบื้องต้นว่า ราคาและการให้คะแนน application มีความสัมพันธ์เชิงเส้นตรงในระดับที่น้อยมาก หรืออาจจะไม่ได้มีความสัมพันธ์เชิงเส้นตรงต่อกันเลย
แหล่งศึกษาค้นคว้าเพิ่มเติมสำหรับการสร้างกราฟด้วยแพ็กเกจ ggplot2
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)
โปรแกรม 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
ในโปรแกรม 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() ภายใต้แพ็กเกจ 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
การกรองข้อมูล เพื่อต้องการเฉพาะแถวหรือหน่วยของข้อมูลที่เป็นไปตามที่ต้องการ เช่น ต้องการ 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
การเรียงลำดับของข้อมูลจากค่าน้อยที่สุดไปหาค่ามากที่สุด หรือเรียงลำดับจากค่ามากที่สุดไปหาค่าน้อยที่สุด เช่น การเรียงลำดับจากค่าน้อยที่สุดไปหาค่ามากที่สุดของตัวแปร 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
การสร้างตัวแปรใหม่ หรืออาจเรียกว่าการแปลงข้อมูล (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
การจัดกลุ่มข้อมูล เพื่อนำเสนอ สร้างชุดข้อมูลใหม่ หรือ จัดทำข้อสรุปของข้อมูล โดยการจำแนกตามข้อมูลจำแนกประเภทบางตัวแปรที่สนใจ เช่น ต้องการหาส่วนเบี่ยงเบนมาตรฐานของตัวแปร 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