R เป็นหนึ่งในภาษาที่ได้รับความนิยมสูงมากสำหรับงาน data science เรียนรู้ง่าย ทำงานได้รวดเร็ว เกิดมาพร้อมกับความสามารถด้านสถิติ (ภาษาอังกฤษ เราเรียก R ว่า fast data crunching language)
R เหมาะสำหรับคนที่ใช้ Excel ในการทำงานอยู่แล้ว ถ้าอยากจะเริ่มเขียนโปรแกรม แอดแนะนำ R เป็นภาษาแรกเพราะ logic ในการทำงานของเครื่องมือสองตัวนี้คล้ายกันมาก (การเรียกใช้งานฟังชั่นเหมือนกันเกือบ 100%)
บทความนี้จะเปรียบเทียบความเหมือน/ แตกต่างของทั้งสองโปรแกรม และอธิบายการทำงานเบื้องต้นของ R ให้กับ Excel users ได้เข้าใจ ไม่ต้องเคยเขียนโปรแกรมมาก่อน ก็อ่านรู้เรื่อง ทำตามได้เลย 😛
Getting Software
สำหรับเพื่อนๆที่อยากทำตาม tutorial วันนี้ต้องติดตั้งโปรแกรมฟรีสองตัวคือ R และ RStudio Desktop ติดตั้งเสร็จแล้วเปิดโปรแกรม RStudio ขึ้นมา และเริ่มเขียนโค้ดในหน้าต่าง console ตามตัวอย่างด้านล่างได้เลย
นักเรียนสามารถดาวน์โหลดไฟล์ csv สำหรับบทความนี้ได้ที่นี่

R Works Like Excel
สำหรับเพื่อนๆที่ใช้ Excel เป็นอยู่แล้ว (รู้ว่า Excel function และ formula คืออะไร?) สามารถเริ่มเขียนภาษา R ได้ง่ายๆ เพราะวิธีการทำงานของทั้งสองโปรแกรมนี้เหมือนกันโดยเฉพาะการใช้งาน functions
output = function( input1, input2, input3, … )
ตารางเปรียบเทียบการเขียนฟังชั่นใน Excel vs. R สิ่งที่แตกต่างกันอย่างแรกคือ Excel เก็บข้อมูลใน spreadsheets เช่น cell A1:A10 แต่ R เก็บข้อมูลด้วยตัวแปร (variable) เช่น ตัวแปร x มีค่าเท่ากับ 1:10
Excel | R Programming |
=AVERAGE(A1:A10) | mean(x) |
=STDEV.S(A1:A10) | sd(x) |
=SUM(A1:A10) | sum(x) |
Tip – สิ่งแรกที่ Excel Users ทุกคนต้องรู้คือ R เป็นภาษาแบบ case sensitive แปลว่าตัวพิมพ์ใหญ่/ ตัวพิมพ์เล็กมีผลกับการรันโค้ด R เขียนผิดนิดเดียวโค้ดจะรันไม่ออกเลย (error)
Read CSV File
มาลอง import csv file เข้าโปรแกรม RStudio กันก่อน
- Unzip ไฟล์ .zip ที่ดาวน์โหลดมาไปวางไว้ที่ path ของฟังชั่น
getwd()
i.e. working directory - เสร็จแล้วใช้ฟังชั่น
read.csv()
เพื่อ import “example_data.csv” ไปเก็บไว้ที่ตัวแปร df ใน R (ชื่อตัวแปรจะตั้งว่าอะไรก็ได้ แต่แอดแนะนำให้ตั้งชื่อแบบเข้าใจง่าย และเป็นตัวพิมพ์เล็กทั้งหมด)
พอ import ไฟล์ข้อมูลเสร็จแล้ว เราสามารถเรียกดู structure ของ dataframe ด้วยฟังชั่น str()
หรือจะแสดงผล 6 แถวแรกของ dataframe ใน console ด้วยฟังชั่น head()
## save csv fiels in this folder | |
getwd() | |
## read a csv file into R | |
df <- read.csv("example_data.csv") | |
## inspect data frame | |
str(df) | |
head(df) |
Tip – R เก็บข้อมูลตัวแปรต่างๆใน RAM ถ้าข้อมูล csv ของเรามีขนาด 500mb R ก็จะจัดสรร RAM 500mb บวกลบนิดหน่อยเพื่อเก็บข้อมูลนี้ i.e. อะไรที่อยู่บน RAM ก็จะทำงานได้เร็วขึ้น นี่คือเหตุผลที่ R วิเคราะห์ข้อมูลได้เร็วกว่า Excel มาก โดยเฉพาะเวลาข้อมูลมีขนาดใหญ่กว่า 1,000,000 records
Basic Statistics
R ถูกพัฒนาขึ้นมาสำหรับการวิเคราะห์ผลสถิติโดยเฉพาะ ถ้าต้องการหาค่าเฉลี่ยของคอลัมน์ age ใน df เราจะเขียน syntax แบบนี้ mean(df$age)
ลองดูตัวอย่างฟังชั่นอื่นๆด้านล่าง mean, median, sd และ sum
## summary statistics | |
summary(df) | |
## basic statistics | |
mean(df$age) | |
median(df$age) | |
sd(df$age) | |
sum(df$age) |
Tip – เราใช้ $
เพื่อเลือกคอลัมน์ที่เราต้องการจาก data frame
If-else
การเขียนเงื่อนไขใน R จะใช้ฟังชั่น ifelse()
โดย syntax จะเหมือนกับฟังชั่น IF()
ของ Excel โดยฟังชั่นนี้จะรับ 3 inputs ดังนี้ ifelse(condition, TRUE, FALSE) คลิปด้านล่าง แอดใช้ฟังชั่น ifelse เพื่อสร้างคอลัมน์ใหม่ชื่อว่า age_group เพิ่มไปที่ df และใช้ฟังชั่น table()
เพื่อสร้างตารางความถี่ของคอลั่มใหม่
Excel | R Programming |
=IF(gpa>=25, “Senior”, “Junior”) | ifelse(df$gpa >= 25, “Senior”, “Junior”) |
Install New Packages
เราสามารถดาวน์โหลดและติดตั้ง package (functions) ใหม่ๆ เพื่อเพิ่มความสามารถของ R ใน laptop ของเราด้วยฟังชั่น install.packages()
พอติดตั้งเสร็จแล้ว เรียกใช้งาน package นั้นๆด้วยฟังชั่น library()
## install packages | |
install.packages("dplyr") | |
library(dplyr) |
Data Transformation
package ที่เราเพิ่งติดตั้งชื่อว่า dplyr เป็น package หลักสำหรับทำ data transformation เช่น การเลือกคอลัมน์ (select) ฟิลเตอร์ข้อมูล (filter) หรือสุ่มตัวอย่าง (sample_n) เป็นต้น โค้ดด้านล่างเราใช้ pipe operator (%>%) เป็น syntax มาตรฐานที่ช่วยให้เราเขียนโค้ด R ได้ง่ายขึ้น อย่างเช่นโค้ด line 6-8 เราเลือกคอลัมน์ id, student_name, gender เสร็จแล้วฟิลเตอร์ข้อมูลให้แสดงเฉพาะผู้ชาย gender == “M”
## select columns | |
df %>% | |
select(id, student_name, gender) | |
## filter rows | |
df %>% | |
select(id, student_name, gender) %>% | |
filter(gender == "M") | |
## sample rows n=30 | |
df %>% | |
sample_n(30) |
Tip – หลัง %>% เรานิยมเคาะ enter หนึ่งครั้งเพื่อขึ้นบรรทัดใหม่ df %>% select() %>% filter()
เป็นเทคนิคการเขียนเชื่อมโค้ดเราเข้าด้วยกันใน R (เรียกว่า chained functions)
Pivot Table
Pivot Table คือการหมุนวิเคราะห์ข้อมูลง่ายๆ เช่น การนับจำนวนความถี่ (n) ของแต่ละกลุ่ม หรือคำนวณค่าสถิติแยกตามกลุ่ม เป็นต้น ตัวอย่างด้านล่างเราใช้ฟังชั่น count()
เพื่อสร้างตารางความถี่ i.e. count values ของคอลัมน์ที่เราต้องการ หรือใช้ syntax df %>% group_by() %>% summarise()
เพื่อคำนวณค่าสถิติแยกตามกลุ่ม
## count gender i.e. number of male and female students | |
df %>% | |
count(gender) | |
## count grouped gender and nationality | |
df %>% | |
count(gender, nationality) | |
## compute average age by gender group i.e. male age vs. female age | |
df %>% | |
group_by(gender) %>% | |
summarise(avg_age = mean(age)) |
VLOOKUP
Excel ใช้ฟังชั่น VLOOKUP()
เพื่อดึงข้อมูลจากตารางที่เราต้องการด้วย lookup value (ดูตัวอย่างการเขียน vlookup ได้ที่นี่) ส่วน R ใช้ฟังชั่น left_join()
ของ dplyr เพื่อดึงข้อมูลจากสองตารางพร้อมๆกัน ได้ผลเหมือนกับการเขียน vlookup แต่ยืดหยุ่นและใช้งานง่ายกว่า ลองดูตารางเปรียบเทียบ syntax ด้านล่าง
Excel | R Programming |
=VLOOKUP(value, table, col_index, FALSE) | left_join(table1, table2, by = “id”) |
## read a lookup table into R | |
lookup_state <- read.csv("lookup_table.csv") | |
## filter only US students | |
df_us <- filter(df, nationality == "US") | |
## we can use left_join to do vlookup in R | |
df_us %>% | |
left_join(lookup_state, by = c("id" = "us_students")) %>% | |
slice(1:10) |
Visualization

R มีความสามารถในการทำ visualization ได้หลายรูปแบบโดยเฉพาะ 2D graphics โค้ดด้านล่างเราลองสร้างกราฟ histogram, bar plot และ scatter plot ตามลำดับ ลองดู gallery แบบเต็มๆได้ที่นี่
## histogram | |
hist(df$age, breaks = 3) | |
## barplot | |
barplot(table(df$nationality)) | |
## scatter plot | |
plot(df$age, df$gpa, pch = 16) |
Summary
Tutorial นี้รีวิวฟังชั่นพื้นฐานใน R สำหรับวิเคราะห์ข้อมูลเบื้องต้น และเปรียบเทียบความเหมือน/ แตกต่างระหว่าง Excel vs. R
- R ทำงานกับข้อมูลขนาดใหญ่ได้เร็วกว่า Excel เพราะว่าเก็บข้อมูลบน RAM/ memory
- import csv file เข้าสู่โปรแกรม RStudio ด้วยฟังชั่น
read.csv()
- คำนวณค่าสถิติง่ายๆด้วยฟังชั่น
mean()
,median()
,sd()
และsum()
- เขียนเงื่อนไขด้วยฟังชั่น
ifelse()
- ติดตั้งและเรียกใช้งาน package ใหม่ใน R ด้วยฟังชั่น
install.packages()
และlibrary()
- สร้าง Pivot Table ง่ายๆสไตล์ R ด้วยฟังชั่น
count()
,group_by()
และsummarise()
- เขียน vlookup สองตารางด้วยฟังชั่น
left_join()
- สร้าง basic visualization ด้วยฟังชั่น
hist()
,barplot()
และplot()
Appendix – Simulated Data
ด้านล่างเป็น R code ที่แอดใช้สร้าง example_data.csv และ lookup_table.csv ที่สอนในบทความนี้ ข้อดีของ R คือความง่ายในการ simulate new dataset ด้วยฟังชั่นพื้นฐานอย่าง sample()
หรือ rnorm()
ถ้าใครอยากเรียน R แบบเต็มๆ เข้าเรียนฟรี Data Analyst Bootcamp (R Track) ได้ที่นี่
## generate vectors | |
set.seed(99) | |
id <- 1:100 | |
student_name <- replicate(100, paste0(sample(LETTERS, size = 5, replace = T), collapse = "")) | |
gender <- factor(sample(c(0,1), size = 100, replace = T, prob = c(.7, .3)), | |
labels = c("M", "F")) | |
age <- sample(19:32, size = 100, replace = T) | |
gpa <- rnorm(n = 100, mean = 3.15, sd = 0.25) | |
gpa <- ifelse(gpa > 4, 4.00, gpa) | |
nationality <- factor(sample(c(0,1,2), size = 100, replace = T, prob = c(0.5, 0.3, 0.2)), | |
labels = c("TH", "US", "CH")) | |
## create a dataframe from vectors | |
df <- data.frame(id, student_name, gender, age, gpa, nationality) | |
head(df) | |
## create a lookup table in this example | |
set.seed(99) | |
us_students <- df %>% filter(nationality == "US") %>% .[["id"]] | |
lookup_state <- data.frame(us_students, | |
states = sample(state.name, size = length(us_students), replace = TRUE)) |