บันทึกการใช้งาน RStudio และ R Programming 103 สำหรับนักวิทยาศาสตร์ข้อมูล Data Science - sprint 03

R เป็นภาษาที่ได้รับเลือก ที่เหมาะสำหรับ Data Analyst และเป็น หนึ่งในสามภาษาที่ Data Analyst จะต้องรู้จัก [Python, R, SQL]
เราสามารถใช้ R อ่านข้อมูลได้หลายประเภท
.txt
.csv
.xlsx
google sheets
.json
.db
(sqlite database)- SQL databases ตัวหลักๆได้หมดเลย PostgreSQL, MySQL, MS SQL, BigQuery, AWS RedShift
ใน RStudio ให้ติดตั้ง Library เหล่านี้เพื่อเรียนในบทนี้
install.packages(c("readr",
"readxl",
"googlesheets4",
"jsonlite",
"dplyr",
"sqldf",
"RSQLite"))
EP01 - Text File
read_table() อ่านไฟล์ .txt ที่ใช้ whitespace เป็นตัวคั่นระหว่าง คอลัมน์ delimeter
การทำงานกับ txt file จะเป็นการนำข้อมูลที่อยู่ใน text มาอยู่ใน R โดยสมมติว่าเรามี file หนึ่งที่เราสร้างขึ้นมา โดยเปิด เมนูสร้างไฟล์ของ RStudio
เราก็จะเห็นว่ามีเมนูที่สามารถสร้างไฟล์ อื่นๆได้ด้วย แต่ในบทนี้เราจะทำงานกับ Text File กัน
สมมติว่าเราสร้างข้อมูลที่อยู่ใน text file ให้เหมือนมีตารางข้อมูลขึ้นมา เช่น ตารางนักเรียน ตามรูปภาพ
ตารางจะมีอยู่ 2 คอลัมน์ และมีรายชื่ออยู่ 5 รายการ โดยตั้งชื่อไฟล์ว่า student.txt
จากนั้นเราทำการ load library ชื่อว่า library(readr)
library(readr)
เวลาที่เปิด RStudio ขึ้นมาทุกครั้งเราจะต้อง load lib ใหม่ทุกครั้งด้วย ฟังก์ชันใน readr นี้จะมีอยู่มากมายให้ลองอ่าน document ของมันดูโดยการใช้คำสั่ง help
จากไฟล์ที่สร้างขึ้น ทุกสร้างขึ้นมาอยู่ในรูปแบบตาราง เราจะใช้ฟังก์ชันที่ชื่อว่า read_table ซึ่งมันจะอ่าน ข้อมูลที่มี white space แยกคอลัมน์เอาไว้ ลองใช้งาน read_table กันดู
read_table("student.txt")
เป็นการเช็คว่าเรียกไฟล์สำเร็จ
output ที่ได้นั้น มันเป็น Data Frame
จากนั้นเราก็นำมาเก็บเอาไว้ใน Object ชื่อ student แล้วเปิด Data Frame ขึ้นมา
student <- read_table("student.txt")
View(student)
EP02 - CSV
read_csv() ใช้อ่านไฟล์ csv หรือ comma separated values เป็น common data format ที่ data analyst เราใช้กัน
อีกไฟล์หนึ่งเรามักจะใช้งานอยู่บ่อยๆ ก็คือ ไฟล์ CSV ซึ่ง ไฟล์จากหัวข้อที่แล้วเราสามารถนำมาปรับเพิ่มได้โดย Save As เป็นอีกหนึ่งไฟล์ ให้ตั้งชื่อว่า student2.csv แล้วแก้จาก white space มาเป็น comma
ทำเหมือนเดิม
student2 <- read_csv("student2.csv")
จากนั้นเราก็จะได้ค่า data frame ขึ้นมาอีกหนึ่งไฟล์โดยชื่อ ไฟล์ว่า student2
EP03 - Excel File
read_excel() ใช้อ่านไฟล์ Excel .xlsx อ่านทีละ sheet ได้เลย
เราจะต้องโหลด readxl ก่อนทุกครั้งที่เปิด Rstudio
ให้เราเปิดไฟล์ Excel ขึ้นมา explore ก่อนเพื่อดูว่าข้อมูลมีอะไรบ้าง
เราจะเห็นว่าไฟล์ excel นี้จะมีอยู่ 3 sheet
read_excel สามารถที่จะอ่านทีละ sheet ได้เลยโดยเขียนตาม code ด้านล่าง
read_excel("students.xlsx", sheet=1)
# Economics
read_excel("students.xlsx", sheet=2)
# Business
read_excel("students.xlsx", sheet=3)
# Data
OR
read_excel("students.xlsx", sheet="Data")
# Data
read_excel("students.xlsx", sheet="Economics")
# Economics
read_excel("students.xlsx", sheet="Business")
# Business
เห็นแบบนี้อาจจะดูยุ่งยากที่ต้องมานั่งเขียนเพื่ออ่านทีละ sheet เรามาเขียน Script เพื่อ loop อ่านในไฟล์ excel เลยดีกว่า
โดยเราสร้าง list ขึ้นมาก่อน
result <- list()
จากนั้นเราก็สร้าง for ขึ้นมาโดยเรารู้ว่ามี อยู่ 3 หน้าเราสามารถเขียนได้ว่า
for(i in 1:3) {
result[[i]] < read_excel(("students.xlsx", sheet=i)
}
แล้วนำตัวแปร result มาแสดงผลตาม array
result[[1]]
result[[2]]
result[[3]]
เขียนรวมกัน
result <- list()
for (i in 1:3) {
result[[i]] <- read_excel("students.xlsx", sheet=i)
}
result[[1]]
result[[2]]
result[[3]]
EP04 - Google Sheets
read_sheet() ใช้อ่าน data จาก Google sheet ถ้าเป็น public link ก่อนใช้คำสั่ง read_sheet() ให้เรารันคำสั่ง gs4_deauth() ก่อน
ในกรณีถ้าไฟล์ตั้งค่าไว้เป็น public ไม่ต้องทำการ login
สร้างไฟล์ google sheet ขึ้นมา
แล้วทำการ share file google sheet ให้เรียบร้อยโดยการกดปุ่ม share แล้วเลือก Anyone with the link ให้เลือกว่า can view
หลังจากได้ link มาแล้วให้มาที่ RStudio แล้ว ใช้คำสั่ง googlesheets4 เพื่อเรียกใช้งาน
library(googlesheets4)
จากนั้นก็เก็บ link เอาไว้ที่ตัวแปร สักตัวหนึ่ง โดยตัด permission ออก
permission คือ หลัง /edit
ตัวอย่าง : xxxxPymIoEY/edit?usp=sharing
url <- "<https://docs.google.com/spreadsheets/d/1V8vE-mhA2yfghFoPc6hK02fJmKDU3YazE0abPymIoEY>"
อย่าลืมคำสั่ง จะต้อง run ไม่อย่างนั้น google จะไม่ยอมให้ดึงมูลไป
gs4_deauth()
จากนั้นให้ใช้คำสั่ง
read_sheet(url, sheet="Student")
เท่านี้ก็จะได้ข้อมูลอยู่ในรูปของ Data Frame มาเก็บเอาไว้ที่โปรแกรม R เรียบร้อย
นำข้อมูลมาเก็บเอาไว้ที่ตัวแปร
df <- read_sheet(url, sheet="Student")
ลองเรียกข้อมูลจากตัวแปร โดยการกด click ที่ environment
EP05 - JSON
fromJSON() ใช้อ่านไฟล์ .json เข้ามาเป็น list ใน R แล้วค่อยใช้ฟังก์ชัน data.frame() เพื่อเปลี่ยน list มาเป็นdata frame
Key ใน JSON ต้องเขียนใน double quote เท่านั้น
ก่อนนำเข้าข้อมูลด้วย JSON อย่าลืม library(jsonlite)
อันดับแรก เราก็สร้างไฟล์ .json ขึ้นมาจากไฟล์ text แล้วเขียนโครงสร้างข้อมูลรูปแบบ json ตัวอย่างเช่น
{
"id":[1,2,3,4],
"name": ["skl", "john", "marry", "lisa"],
"love_programming": [true,true,false,false]
}
แล้วก็เรียกคำสั่งตามนี้ได้เลย
library(jsonlite)
bp <- data.frame(fromJSON("programmer.json"))
View(bp)
json จะต้อง wrap ด้วย data.frame ก่อนจึงจะเป็น Data Frame
EP06 - Bind Rows (UNION ALL)
bind_rows() เทียบเท่ากับ การเขียน UNION ALL ใน SQL
เรามาลองดูวิธีการ ต่อ Data Frame หรือการทำ Union กันบ้างเราเรียกวิธีนี้ว่า UNION ALL โดยใช้คำสั่ง bind_rows()
จาก EP03 เราเรียนวิธีการนำเข้าข้อมูลจาก Excel กันแล้วให้ลองนำข้อมูลจาก EP03 มาลองทำได้เลย โดยเราจะต้องเรียกการใช้งาน การนำเข้า excel ก่อน
library(dplyr)
library(readxl)
จากนั้นเราก็ read_excel จาก ทั้ง 3 sheet มาเก็บเอาไว้ในแต่ละตัวแปร
# read excel file
economy = read_excel("students.xlsx", sheet=1)
business = read_excel("students.xlsx", sheet=2)
data = read_excel("students.xlsx", sheet=3)
สังเกตได้ว่า ข้อมูลทั้ง 3 ชุดนี้ เป็น data frame และมีมิติที่เท่ากัน
คราวนี้เราจะผูกข้อมูลทั้ง 3 ชุดนี้เข้าด้วยกัน
bind_rows(economy, business, data)
จากเห็นว่า ข้อมูลทั้งหมดผูกเข้าด้วยกันแล้ว
เราสามารถที่จะเขียน code ให้สั้นกว่านี้ได้อีก คือ วิธีการใช้ list
เราจะสร้าง list ขึ้นมาก่อน
list_df <- list(economy, business, data)
จากนั้นเราก็เอา list ไปเข้าฟังก์ชัน bind_rows() ได้เลย
full_df <- bind_rows(list_df)
EP07 - Bind Cols (≠ JOIN)
bind_cols() ไม่เท่ากับการเขียน Join เพราะ bind columns. ไม่จำเป็นต้องใช้ key ใดๆ แค่เอา data frame สองตัวมาวางต่อกัน ซ้าย - ขวา
เราลองมา Bind แบบ column กันบ้าง โดยจะเอาข้อมูลเดิมจาก EP06 ที่ได้จาก excel มาทำ bind_cols()
bind_cols(economy, business)
EP08 - SQL
sqldf() ใช้เขียน SQL เพื่อจัดการกับ dataframe ที่อยู่ใน R
คราวนี้เรามาลองใช้ SQL statement ในการจัดการข้อมูลที่อยู่ใน R กันบ้าง
โดยเรามีข้อมูลจากไฟล์ csv หน้าตาแบบนี้ แล้วนำเข้ามาวางเอาไว้ใน R แล้วทำแบบเดิมคือ
นำเข้าข้อมูลด้วย read_csv
แต่ก่อนอื่น อย่าลืมโหลด library ที่เกี่ยวข้องกันก่อน แล้วก็ read_csv ได้เลย
# load library sqldf
library(sqldf)
library(readr)
school <- read_csv("school.csv")
คราวนี้ เราก็จะได้ Data frame ที่ชื่อ school มาแล้วเรียบร้อย เราสามารถที่จะจัดการข้อมูลด้วย SQL จาห sqldf ได้ เช่น
sqldf("select * from school;")
sqldf("select avg(student), sum(student) from school;")
sqldf("select school_id, school_name, country from school;")
เราสามารถที่จะเขียน statement ไปเก็บเอาไว้ที่ตัวแปร ให้เรียบร้อยก่อนก็ได้
sql_query <- "select * from school where country = 'USA';"
usa_school <- sqldf(sql_query)
EP09 - SQLite
How to read data from SQLite database
ใน R เราใช้ library RSQLite เพื่อจัดการข้อมูลใน sqlite .db file ขั้นตอนการทำงานกับ database จะแบ่งเป็น 3 ขั้นตอน
- connect ข้อมูลที่ database
- ดึงข้อมูลด้วย SQL
- disconnect from database
สมมติว่าเราได้ไฟล์ .db มาจากฐานข้อมูลที่ไหนสักแห่ง หรือจากหลายแห่ง เราสามารถที่จะใช้ R มาจัดการข้อมูลที่อยู่ใน ไฟล์ .db ได้เลย เพียงแค่ในขั้นตอนที่ 1 เราจะต้องรู้ว่าไฟล์ .db เป็น database ชนิดไหน ในที่นี้ เราใช้ SQLite
# load library
library(RSQLite)
# connect to SQLite database (.db file)
# 1. open connection
conn <- dbConnect(SQLite(), "chinook.db")
# 2. get data
dbListTables(conn)
จากการใช้ dbListTable จะเป็นการเรียกดู Table ที่อยู่ใน file
และถ้าเราอยากดู table customers ว่ามี กี่ column เราใช้ dbListFields
dbListFields(conn, "customers")
df <- dbGetQuery(conn, "select * from customers where country = 'USA'")
df2 <- dbGetQuery(conn, "select * from customers where country = 'United Kingdom'")
เราสามารถที่จะใช้ SQL จัดการข้อมูลแล้วนำมาเก็บเอาไว้ใน Data Frame ของ R ได้แล้ว
สุดท้ายอย่าลืม Disconnect ด้วย
# 3. close connection
dbDisconnect(conn)
EP10 - How to Save data in R
เราสามารถ Save data ใน R ได้สองแบบและสามารถโหลดข้อมูลกลับมาใช้ได้อีกครั้งในอนาคต
- save_image() ใช้ save object ทั้งหมดที่อยู่ใน environment ของเราเข้าไปที่ไฟล์ .RData
- saveRDS() ใช้ save single object แค่ไฟล์ที่ไฟล์ .rds
ถ้าต้องการโหลด ไฟล์ .RData ให้ใช้ฟังก์ชัน load() หรือถ้าอยากโหลด .rds ให้ใช้ฟังก์ชัน readRDS()
# จะเป็นการ save ทั้งหมดใน environment ที่ได้ทำมา
save_image(file = "data.Rdata")
load(file = "data.Rdata")
# เป็นการ save object เดียว
saveRDS(business, "business.rds")
readRDS("business.rds")
คอร์สนี้ดีมากกกก (ไก่ ล้านตัว) ใครอ่านจบ แนะนำว่าให้ไปสมัครเรียน ติดตามได้ที่ link ด้านล่างนี้เลย
Course Online DATA ROCKIE Bootcamp
