เอกสาร R Markdown ภาษาไทยชุดนี้อธิบาย การทำงานของโปรแกรม R/RStudio programming หัวข้อเรื่อง Introduction to R programming ในรายวิชา 2104525 Compuational Methods for IE เอกสารภาษาไทยชุดนี้ประกอบด้วย 3 ส่วน ได้แก่
data.table
(ไฟล์ปัจจุบัน)ในส่วนนี้จะเป็นการแนะนำ ฐานข้อมูล iris
ซึ่งเป็นข้อมูลขนาดของกลีบดอก (patel) กลีบใบ (saple) และประเภทของดอกไอริส 3 ประเภท ข้อมูลดังกล่าวได้ติดตั้งที่อยู่ใน base
ของโปรแกรม R
ก่อนการวิเคราะห์ข้อมูลนักวิเคราะห์ควรเข้าใจถึงโครงสร้างและที่มาข้อมูล
str(iris)
## 'data.frame': 150 obs. of 5 variables:
## $ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
## $ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
## $ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
## $ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
## $ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
summary(iris)
## 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
## Species
## setosa :50
## versicolor:50
## virginica :50
##
##
##
which()
ควบคู่กับ is.na()
และมักนำไปสู่การลบข้อมูลด้งกล่าว หรือ แทนค่าunique()
หรือ duplicated()
which(iris=='') ## แสดงตำแหน่งของข้อมูลที่เป็นช่องว่าง ('')
## integer(0)
which(is.na(iris),arr.ind=T) ## แสดงแถว และ คอลัมภ์ ของข้อมูลหายไป (NA)
## row col
(1:nrow(iris))[duplicated(iris)] ## แสดงข้อมูลที่ซ้ำซ้อนกัน
## [1] 143
data.frame
โครงสร้างของ data.frame
โครงสร้างฐานข้อมูลพื้นฐานในโปรแกรม R/RStudio ผสมระหว่าง Matrix และ List ซึ่งแต่ละคอลัมภ์ ข้อมูล
\[ DF[\ll row\gg,\ll col \gg]\]
head(iris[[1]]) ## เข้าถึงแบบ ลำดับของ List
## [1] 5.1 4.9 4.7 4.6 5.0 5.4
head(iris$Sepal.Length) ## เข้าถึงแบบ ชื่อของ List
## [1] 5.1 4.9 4.7 4.6 5.0 5.4
head(iris[,1]) ## เข้าถึงแบบ Matrix
## [1] 5.1 4.9 4.7 4.6 5.0 5.4
คำสั่ง str()
และ summary()
สามารถใช้ตรวจสอบประเภทและสถิติของข้อมูลได้
str(iris)
## 'data.frame': 150 obs. of 5 variables:
## $ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
## $ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
## $ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
## $ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
## $ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
summary(iris)
## 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
## Species
## setosa :50
## versicolor:50
## virginica :50
##
##
##
cbind
หรือrbind
รวมฐานข้อมูล ตามคอลัมภ์ หรือ ตามแถวdata.frame()
สร้าง data.frame
จากการป้อนค่า หรือ ตัวแปรอื่นas.data.frame()
เปลี่ยนข้อมูลให้อยู่ในรูป data.frame
is.data.frame()
ตรวจสอบว่าข้อมูลให้อยู่ในรูป data.frame
หรือไม่summarytools
การสรุปข้อมูลสามารถทำได้โดย summarytools
package
require(summarytools)
##-- general stat+dist summary of data
print(summarytools::dfSummary(iris),method = "render")
No | Variable | Stats / Values | Freqs (% of Valid) | Graph | Valid | Missing | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | Sepal.Length [numeric] | Mean (sd) : 5.8 (0.8) min < med < max: 4.3 < 5.8 < 7.9 IQR (CV) : 1.3 (0.1) | 35 distinct values | 150 (100.0%) | 0 (0.0%) | |||||||||||||
2 | Sepal.Width [numeric] | Mean (sd) : 3.1 (0.4) min < med < max: 2 < 3 < 4.4 IQR (CV) : 0.5 (0.1) | 23 distinct values | 150 (100.0%) | 0 (0.0%) | |||||||||||||
3 | Petal.Length [numeric] | Mean (sd) : 3.8 (1.8) min < med < max: 1 < 4.3 < 6.9 IQR (CV) : 3.5 (0.5) | 43 distinct values | 150 (100.0%) | 0 (0.0%) | |||||||||||||
4 | Petal.Width [numeric] | Mean (sd) : 1.2 (0.8) min < med < max: 0.1 < 1.3 < 2.5 IQR (CV) : 1.5 (0.6) | 22 distinct values | 150 (100.0%) | 0 (0.0%) | |||||||||||||
5 | Species [factor] | 1. setosa 2. versicolor 3. virginica |
|
150 (100.0%) | 0 (0.0%) |
Generated by summarytools 0.9.8 (R version 3.6.3)
2021-09-10
##-- numeric desc stat summary of data
print(summarytools::descr(iris),method = "render")
Petal.Length | Petal.Width | Sepal.Length | Sepal.Width | |
---|---|---|---|---|
Mean | 3.76 | 1.20 | 5.84 | 3.06 |
Std.Dev | 1.77 | 0.76 | 0.83 | 0.44 |
Min | 1.00 | 0.10 | 4.30 | 2.00 |
Q1 | 1.60 | 0.30 | 5.10 | 2.80 |
Median | 4.35 | 1.30 | 5.80 | 3.00 |
Q3 | 5.10 | 1.80 | 6.40 | 3.30 |
Max | 6.90 | 2.50 | 7.90 | 4.40 |
MAD | 1.85 | 1.04 | 1.04 | 0.44 |
IQR | 3.50 | 1.50 | 1.30 | 0.50 |
CV | 0.47 | 0.64 | 0.14 | 0.14 |
Skewness | -0.27 | -0.10 | 0.31 | 0.31 |
SE.Skewness | 0.20 | 0.20 | 0.20 | 0.20 |
Kurtosis | -1.42 | -1.36 | -0.61 | 0.14 |
N.Valid | 150 | 150 | 150 | 150 |
Pct.Valid | 100.00 | 100.00 | 100.00 | 100.00 |
Generated by summarytools 0.9.8 (R version 3.6.3)
2021-09-10
##-- factor summary of data
print(summarytools::freq(iris$Species),method = "render")
Valid | Total | ||||
---|---|---|---|---|---|
Species | Freq | % | % Cum. | % | % Cum. |
setosa | 50 | 33.33 | 33.33 | 33.33 | 33.33 |
versicolor | 50 | 33.33 | 66.67 | 33.33 | 66.67 |
virginica | 50 | 33.33 | 100.00 | 33.33 | 100.00 |
<NA> | 0 | 0.00 | 100.00 | ||
Total | 150 | 100.00 | 100.00 | 100.00 | 100.00 |
Generated by summarytools 0.9.8 (R version 3.6.3)
2021-09-10
dfSummary()
เป็นการสรุปสถิติและการกระจายของข้อมูลdescr()
เป็นการสรุปสถิติของข้อมูลประเภทตัวเลข (numeric
)freq()
เป็นการสรุปสถิติของข้อมูลความถี่ (factor
)ctree()
เป็นการสรุปสถิติของข้อมูลความถี่ (factor
) สองกลุ่มโครงสร้างของ data.table
ในโปรแกรม R/RStudio
\[ DT[\ll condition \gg,\ll operation\gg,\text{by}=\ll col_{grouped}\gg,\text{on}= \ll col_{jointed} \gg ]\]
การสร้าง object ใน package data.table
สามารถทำโดยการ cast จาก data.frame()
ด้วยคำสั่ง as.data.table()
require(data.table)
## Loading required package: data.table
iris.DT <- as.data.table(iris)
iris.DT
## 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
## ---
## 146: 6.7 3.0 5.2 2.3 virginica
## 147: 6.3 2.5 5.0 1.9 virginica
## 148: 6.5 3.0 5.2 2.0 virginica
## 149: 6.2 3.4 5.4 2.3 virginica
## 150: 5.9 3.0 5.1 1.8 virginica
การเรียก object จะเป็นแสดงเฉพาะ 5 แรกแถว และ 5 ท้ายแถวของชุดข้อมูล
การกรองข้อมูลตามเงือนไขสามารถทำได้โดยการ ระบุเงื่อนไขที่ต้องการตามหลัง object ใน data.table
package อนึ่งการเพิ่มเงือนไขทำได้โดยการซ้อน []
iris.DT[Sepal.Length <= 4.5 & Sepal.Width >= 3.0 ]
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1: 4.3 3.0 1.1 0.1 setosa
## 2: 4.4 3.0 1.3 0.2 setosa
## 3: 4.4 3.2 1.3 0.2 setosa
iris.DT[Sepal.Length <= 4.5 & Species=='setosa'][order(-Sepal.Width)]
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1: 4.4 3.2 1.3 0.2 setosa
## 2: 4.3 3.0 1.1 0.1 setosa
## 3: 4.4 3.0 1.3 0.2 setosa
## 4: 4.4 2.9 1.4 0.2 setosa
## 5: 4.5 2.3 1.3 0.3 setosa
between()
เป็นการระบุช่วงการค้นหาตัวเลข%like%
เป็นการหาคำคล้ายการสรุปข้อมูลสามารถทำได้โดยการฟังก์การสรุป พร้อมกลุ่มข้อมูลหลัง ,
แรกของ object ใน data.table
package
iris.DT[, mean(Sepal.Length), by=Species ]
## Species V1
## 1: setosa 5.006
## 2: versicolor 5.936
## 3: virginica 6.588
หากต้องการสรุปด้วยฟังก์ชั่นเดียวกันมากกว่า 1 คอลัมภ์ ใช้ .SD
หรือ .SDCols
ระบุคอลัมภ์ที่ต้องการ
iris.DT[,lapply(.SD,mean), by=Species ]
## Species Sepal.Length Sepal.Width Petal.Length Petal.Width
## 1: setosa 5.006 3.428 1.462 0.246
## 2: versicolor 5.936 2.770 4.260 1.326
## 3: virginica 6.588 2.974 5.552 2.026
iris.DT[,lapply(.SD,sd), .SDcols=c("Sepal.Length","Sepal.Width"),by=Species ]
## Species Sepal.Length Sepal.Width
## 1: setosa 0.3524897 0.3790644
## 2: versicolor 0.5161711 0.3137983
## 3: virginica 0.6358796 0.3224966
หากต้องการสรุปหลายฟังก์ชั่นสามารถทำโดยใช้ .()
ในการแยก
iris.DT[,.(avgSep=mean(Sepal.Width),sdSep=sd(Sepal.Width)), by=Species ]
## Species avgSep sdSep
## 1: setosa 3.428 0.3790644
## 2: versicolor 2.770 0.3137983
## 3: virginica 2.974 0.3224966
การสร้างคอลัมภ์ใหม่สามารถทำได้โดยใช้เครื่องหมาย :=
iris.DT[,sText:= fcase(
Sepal.Length < 5.0 , "<5",
Sepal.Length > 7.0 , "7+",
default = "5-7"
) ]
## iris.DT[,sTest:= cut(Sepal.Length,c(0.0,5.0,7.0,20.0),
## label=c("<5","5-7","7+") )]
iris.DT[,.(mean(Sepal.Length),.N),by=.(Species,sText)]
## Species sText V1 N
## 1: setosa 5-7 5.230000 30
## 2: setosa <5 4.670000 20
## 3: versicolor 5-7 5.957143 49
## 4: versicolor <5 4.900000 1
## 5: virginica 5-7 6.345946 37
## 6: virginica 7+ 7.475000 12
## 7: virginica <5 4.900000 1
fcase()
และการประยกุต์ใช้ifelse()
เป็นการสร้างเงือนไข ifelse(Sepal.Length<5.0,"<5",ifelse(Sepal.Length>7,"7+","5-7") )
cut( _cRange_,_cLabel_)
เป็นการกำหนดช่วงและสร้าง label cut(Sepal.Length,c(0.0,5.0,7.0,20.0),label=c("<5","5-7","7+"))
package stringr
ควบคู่ไปกับ data.table
ในการจัดการข้อมูลได้
require(stringr)
iris.DT[ ,tSp:= str_sub(Species,1,3)]
xtabs(~tSp+sText,iris.DT)
## sText
## tSp <5 5-7 7+
## set 20 30 0
## ver 1 49 0
## vir 1 37 12
print(summarytools::ctable(iris.DT$tSp,iris.DT$sText ),method = "render")
sText | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
tSp | <5 | 5-7 | 7+ | Total | ||||||||||||
set | 20 | ( | 40.0% | ) | 30 | ( | 60.0% | ) | 0 | ( | 0.0% | ) | 50 | ( | 100.0% | ) |
ver | 1 | ( | 2.0% | ) | 49 | ( | 98.0% | ) | 0 | ( | 0.0% | ) | 50 | ( | 100.0% | ) |
vir | 1 | ( | 2.0% | ) | 37 | ( | 74.0% | ) | 12 | ( | 24.0% | ) | 50 | ( | 100.0% | ) |
Total | 22 | ( | 14.7% | ) | 116 | ( | 77.3% | ) | 12 | ( | 8.0% | ) | 150 | ( | 100.0% | ) |
Generated by summarytools 0.9.8 (R version 3.6.3)
2021-09-10
หมายเหตุ
stringr::str_c()
เป็นการรวม string ของคอลัมภ์ที่กำหนดstringr::str_sub()
เป็นการดึง sub string ของคอลัมภ์ที่กำหนดggplot
ควบคู่ไปกับ data.table
และ dplyr
ในการแสดงข้อมูลเป็นรูปภาพ หรือ กราฟ
require(ggplot2)
require(dplyr)
##-- plot contour
ggplot(iris.DT,aes(x=Sepal.Width,y=Sepal.Length,color=Species)) + geom_density_2d()
##-- seperate data filter and query
iris.DT[Species %like% "color"] %>%
ggplot(aes(x=Sepal.Width,y=Sepal.Length,color=Species)) + geom_point()
หมายเหตุ
%>%
คือเครื่องหมายในการส่งข้อมูล (pipe) ใน package dplyr
Copyright 2019 Oran Kittithreerapronchai. All Rights Reserved. Last modified: 2021-49-10,