จากบทที่ 1 และบทที่ 2 เราได้เรียนเรื่องชนิดของตัวแปร หรือชนิดของข้อมูลมาแล้วในบทน้ีเรา จะพูดถีงกระบวนการทางคณิตศาสตร์และการเปรียบขนิดต่างๆ ในทางคณิตศาสตร์แล้วชนิดของตัวแปรที่จะนำมาทำการพีชคณิตกันได้ ต้องเป็นตัวเลขเท่านั้น แต่ในภาษาอาร์หรือภาษาอื่นๆ ต่าความจริง (TRUE=1)และความเท็จ(FALSE=0) ก็สามารถนำมาทำการพีชคณิตกันได้
พีชคณิตเบื้องต้นที่สำคัญการ การบวก การลบ การคูณ การหาร ถ้าเป็นเป็นตัวแปรเวคเตอร์ 1 มิติ สามารถทำได้พีชคณิตกันได้ทันที เช่น
# กำหนด x = 3
x <- 3
# กำหนด y = 5
y <- 5
# การบวก
x+y
## [1] 8
# ตัวเลข บวกกับ ค่าตรรกะ
x+TRUE
## [1] 4
# การลบ
x-y
## [1] -2
# การคูณ
x*y
## [1] 15
# ค่าตรรกะคูณกับ y
FALSE*y
## [1] 0
# การหาร
x/y
## [1] 0.6
การยกกำลัง ทำได้ 2วิธี
# การยกกำลัง 2 แบบแรก
x**2
## [1] 9
# การยกกำลังอีกแบบ
x^2
## [1] 9
การหารเอาเศษ(modulus)
# การหารเอาเศษ
y %% x
## [1] 2
การหารเอาส่วน
# การหารเอาส่วน
y %/% x
## [1] 1
การทำพีขคณิตกันของตัวแปรเวคเตอร์ 1 มิติกับตัวแปรเวคเตอร์มากกว่าหรือเท่ากับ 2 มิติขึ้นไป ภาษาอาร์ จะมองเห็นตัวแปรเวคเตอร์ 1 มิติเป็นตัวแปรเวคเตอร์ ที่ขนาดมิติเท่ากับตัวที่ทำการพีชคณิตกันอยู่ เช่น
# กำหนดให้ x = 5
x <- 5
# กำหนดให้ y เป็นเวคเตอร์ตัวเลข
y <- 1:5
# ตัวเลขบวกกับเวคเตอร์
x+y
## [1] 6 7 8 9 10
# ตัวเลขลบกับเวคเตอร์
x-y
## [1] 4 3 2 1 0
# ตัวเลขคูณกับเวคเตอร์
x*y
## [1] 5 10 15 20 25
# ตัวเลขหารกับเวคเตอร์
x/y
## [1] 5.000000 2.500000 1.666667 1.250000 1.000000
# เวคเตอร์หารด้วยตัวเลข
y/x
## [1] 0.2 0.4 0.6 0.8 1.0
# ตัวเลขยกกำลังเวคเตอร์
x^y
## [1] 5 25 125 625 3125
# เวคเตอร์ยกกำลังตัวเลข
y^x
## [1] 1 32 243 1024 3125
# ตัวเลขหารเอาเศษด้วยเวคเตอร์
x %% y
## [1] 0 1 2 1 0
# เวคเตอร์หารเศษด้วยตัวเลข
y %% x
## [1] 1 2 3 4 0
# ตัวเลขหารเอาส่วนด้วยเวตเตอร์
x %/% y
## [1] 5 2 1 1 1
# เวคเตอร์หารเอาส่วนด้วยตัวเลข
y %/% x
## [1] 0 0 0 0 1
ถ้าเวคเตอร์ทั้งสองมีขนาดมิติไม่เท่ากับหนึ่งและมีขนาดมิติไม่เท่ากัน ก็สามารถทำการพีชคณิตกันได้ โดยเวคเตอร์ใดที่มีมิติน้อยกว่า จะถูกสร้างใหม่ให้มีมิติเท่ากับเวคเตอร์อีกตัวที่มีมิติมากกว่า โดยการนำค่าเวคเตอร์ของตัวเองมาต่อท้ายไปเรื่อยๆจนกว่าจะมีขนาดมิติเท่ากับตัวที่มากกว่านั้นเอง และจะได้รับข้อความการเตือนจากภาษาอาร์
# สร้างเวคเตอร์ x
x<-1:2
# สร้าวเวคเตอร์ y
y<-3:5
x+y
## Warning in x + y: longer object length is not a multiple of shorter object
## length
## [1] 4 6 6
x-y
## Warning in x - y: longer object length is not a multiple of shorter object
## length
## [1] -2 -2 -4
x/y
## Warning in x/y: longer object length is not a multiple of shorter object length
## [1] 0.3333333 0.5000000 0.2000000
x*y
## Warning in x * y: longer object length is not a multiple of shorter object
## length
## [1] 3 8 5
x^y
## Warning in x^y: longer object length is not a multiple of shorter object length
## [1] 1 16 1
โดยการพีชคณิตทั้งหมดนี้จะกระทำโดย ค่าในแต่ละเวคเตอร์ที่ตำแหน่งมิติเดียวกัน
สำหรับเวตเตอร์ 1 มิติสามารถสามารถทำการพีชคณิตกับเมทริกซได้ \[A=\begin{bmatrix}1&3\\2&4 \end{bmatrix}\]
A <-matrix(1:4,ncol= 2)
A
## [,1] [,2]
## [1,] 1 3
## [2,] 2 4
\[\begin{bmatrix} 1&3\\2&4 \end{bmatrix}+2 = \begin{bmatrix} 1+2&3+2\\2+2&4+2 \end{bmatrix}=\begin{bmatrix}3&5\\4&6 \end{bmatrix}\]
A+2
## [,1] [,2]
## [1,] 3 5
## [2,] 4 6
\[\begin{bmatrix} 1&3\\2&4 \end{bmatrix}-2 = \begin{bmatrix} 1-2&3-2\\2-2&4-2 \end{bmatrix}=\begin{bmatrix} -1&1\\0&2 \end{bmatrix}\]
A-2
## [,1] [,2]
## [1,] -1 1
## [2,] 0 2
\[2\times\begin{bmatrix} 1&3\\2&4 \end{bmatrix} = \begin{bmatrix} 2\times1&2\times3\\2\times2&2\times4 \end{bmatrix}=\begin{bmatrix}2&6\\4&8\end{bmatrix}\]
2*A
## [,1] [,2]
## [1,] 2 6
## [2,] 4 8
\[\dfrac{2}{\begin{bmatrix} 1&3\\2&4 \end{bmatrix}} = \begin{bmatrix} \dfrac{2}{1}&\dfrac{2}{3}\\ \dfrac{2}{2}&\dfrac{2}{4}\\ \end{bmatrix}\]
2/A
## [,1] [,2]
## [1,] 2 0.6666667
## [2,] 1 0.5000000
\[\begin{bmatrix} 1&3\\2&4\end{bmatrix}^2 = \begin{bmatrix} 1&3\\2&4\end{bmatrix}\times \begin{bmatrix} 1&3\\2&4\end{bmatrix}= \begin{bmatrix} 7&15\\10&22 \end{bmatrix}\]
A^2
## [,1] [,2]
## [1,] 1 9
## [2,] 4 16
ไม่ใช่การยกดำลังแบบที่เราใช้ในทางคณิตศาสตร์ ต้องใช้ชุดคำสั่งจาก package expm
library(expm)
## Loading required package: Matrix
##
## Attaching package: 'expm'
## The following object is masked from 'package:Matrix':
##
## expm
A%^%2
## [,1] [,2]
## [1,] 7 15
## [2,] 10 22
\[2^{\begin{bmatrix} 1&3\\2&4 \end{bmatrix}} = \begin{bmatrix} 2^1& 2^3\\ 2^2 &2^4 \end{bmatrix}\]
2^A
## [,1] [,2]
## [1,] 2 8
## [2,] 4 16
ถ้าเมทริกซ์ทั้งสองมีขนาดมิติเท่ากัน ก็สามารถทำได้บวกลบได้แบบเมทริกซ์ทั่วไป แต่สำหรับการคูณและการหารต้องระวังเพราะอาจจะไม่ใช่การคูณและหารแบบที่เราเคยศึกษากันมา \[B=\begin{bmatrix}5&7\\6&8\end{bmatrix}\]
B<-matrix(5:8,nrow=2)
B
## [,1] [,2]
## [1,] 5 7
## [2,] 6 8
\[\begin{bmatrix}1&3\\2&4 \end{bmatrix}+ \begin{bmatrix}5&7\\6&8 \end{bmatrix}= \begin{bmatrix}1+5&3+7\\2+6&4+8 \end{bmatrix}\]
A+B
## [,1] [,2]
## [1,] 6 10
## [2,] 8 12
\[\begin{bmatrix}1&3\\2&4 \end{bmatrix}- \begin{bmatrix}5&7\\6&8 \end{bmatrix}= \begin{bmatrix}1-5&3-7\\2-6&4-8 \end{bmatrix}\]
A-B
## [,1] [,2]
## [1,] -4 -4
## [2,] -4 -4
\[\begin{bmatrix}1&3\\2&4 \end{bmatrix}\times \begin{bmatrix}5&7\\6&8 \end{bmatrix}= \begin{bmatrix}1\times 5+3\times 6 & 1\times 7+3\times 8\\ 2\times 5+4\times 6 & 2\times 7+4\times 8\end{bmatrix}=\begin{bmatrix}23&31\\34&46 \end{bmatrix}\]
A*B
## [,1] [,2]
## [1,] 5 21
## [2,] 12 32
ไม่ใช่การคูณกับแบบเมตริกซ์ที่เราเรียนมาต้องใช้คำสั่งดังนี้
A%*%B
## [,1] [,2]
## [1,] 23 31
## [2,] 34 46
\[\dfrac{\begin{bmatrix}1&3\\2&4 \end{bmatrix}}{ \begin{bmatrix}5&7\\6&8 \end{bmatrix}}=\begin{bmatrix} \dfrac{1}{5}&\dfrac{3}{7}\\ \dfrac{2}{6}&\dfrac{4}{8} \end{bmatrix}\]
A/B
## [,1] [,2]
## [1,] 0.2000000 0.4285714
## [2,] 0.3333333 0.5000000
ในพีชคณิตเมทริกซ์ ไม่มีการหารกันแบบเมทริกซ์ ในโปรแกรมอาร์จะเป็นการหารระหว่างค่าในเมทริกซ์ที่อันดับแถวและสดมภ์ตรงกัน
เมทริกซ์จะมีอินเวอร์สได้ จะต้องเป็นเมทริกซ์ที่จำนวนแถวและสดมภ์เท่ากันเท่านั้นและดีเทอร์มิแนนท์ต้องไม่เท่ากับศูนย์ \[det\left(A\right)=\begin{vmatrix}1 &3\\2&4\end{vmatrix}=1\times 4-2\times 3=-2\]
det(A)
## [1] -2
\[A^{-1}\]
solve(A)
## [,1] [,2]
## [1,] -2 1.5
## [2,] 1 -0.5
\[A^T=\begin{bmatrix} 1&3\\2&4 \end{bmatrix}^T=\begin{bmatrix} 1&2\\3&4 \end{bmatrix}\]
t(A)
## [,1] [,2]
## [1,] 1 2
## [2,] 3 4
diag(2)
## [,1] [,2]
## [1,] 1 0
## [2,] 0 1
diag(4)
## [,1] [,2] [,3] [,4]
## [1,] 1 0 0 0
## [2,] 0 1 0 0
## [3,] 0 0 1 0
## [4,] 0 0 0 1
ในกรณีที่ต้องการดึงค่าแนวทะแยงออกมาจากเมตริกซ์ออกมาเป็นเวคเตอร์ก็สามารถทำได้ โดยใช้คำสั่ง diag() เช่นเดียวกัน
diag(A)
## [1] 1 4
diag(B)
## [1] 5 8
ฟังก์ชันทางคณิตศาสตร์ในภาษาอาร์ ถ้าข้อมูลเป็นเวคเตอร์หรือเมทริกซ์ผลลัพธ์ที่ได้จะออกมาเป็นเวคเตอร์หรือเมตริกซ์ทีมีมิติเหมือนเดิม เช่น
abs() คือฟังก์ชันค่าสัมบูรณ์
sqrt() คือค่ารากที่ 2
sin(), cos(), tan() คือค่าฟังก์ชันไซน์ในตรีโกณมิติ
exp() คือการยกกำลังของฟังก์ชันเอกโพเนนเชียล
log() คือฟังก์ชันเลขฐานธรรมชาติ
factorial() แฟกทอเรียล
permutation วิธีการเรียงสับเปลี่ยน
combination วิธีการเรียงจัดหมู่ เป็นต้น
\[\begin{aligned}|x|=\begin{cases}-x,~&x<0\\x,~&x\geq 0 \end{cases}\end{aligned}\]
C<-c(-1,2,-4,-6,7)
C
## [1] -1 2 -4 -6 7
abs(C)
## [1] 1 2 4 6 7
abs(A)
## [,1] [,2]
## [1,] 1 3
## [2,] 2 4
\[\sqrt{x}\]
D<- 2:5
sqrt(D)
## [1] 1.414214 1.732051 2.000000 2.236068
sqrt(A)
## [,1] [,2]
## [1,] 1.000000 1.732051
## [2,] 1.414214 2.000000
\[\log_e(x)\text{ หรือ} \ln(x)\]
log(2)
## [1] 0.6931472
log(D)
## [1] 0.6931472 1.0986123 1.3862944 1.6094379
log(A)
## [,1] [,2]
## [1,] 0.0000000 1.098612
## [2,] 0.6931472 1.386294
\[\exp(x)\text{ หรือ } e^x \]
exp(2)
## [1] 7.389056
exp(D)
## [1] 7.389056 20.085537 54.598150 148.413159
exp(A)
## [,1] [,2]
## [1,] 2.718282 20.08554
## [2,] 7.389056 54.59815
\[\sin(x),\cos(x),tan(x)\]
sin(2)
## [1] 0.9092974
cos(D)
## [1] -0.4161468 -0.9899925 -0.6536436 0.2836622
tan(A)
## [,1] [,2]
## [1,] 1.557408 -0.1425465
## [2,] -2.185040 1.1578213
นิยาม คือ \[n! =\prod_{i=1}^n i=1\times 2\times 3\cdots \times n \] หรือเขียนในอีกรูปแบบคือ \[ n!=n\times (n-1)!\] ค่าที่สำคัญต้องจำคือ \[ 0!=1\] คำสั่งในอาร์ คือ
# 5!=5x4x3x2x1=120
factorial(5)
## [1] 120
มีนิยามดังนี้ \[C_{n,k}=\begin{pmatrix}n\\k\end{pmatrix}=\dfrac{n!}{(n-k)!\times k!} \] ตัวอย่าง \[C_{5,3}=\begin{pmatrix}5\\3\end{pmatrix}=\dfrac{5!}{(5-3)!\times 3!}=\dfrac{5!}{2!\times 3!}=10 \] คำสั่งในอาร์ คือ
choose(5,3)
## [1] 10
มีนิยามดังนี้ \[P_{n,k}=\dfrac{n!}{(n-k)!} \] ตัวอย่าง \[P_{5,3}=\dfrac{5!}{(5-3)!}=60 \] การเรียงสับเปลี่ยนนี้ไม่มีคำสั่งโดยตรง ดังนั้นให้ประยุกต์คำสั่งในอาร์ดังนี้
choose(5,3)*factorial(3)
## [1] 60
pi
## [1] 3.141593
มีเป้าหมายเพื่อต้องการที่จะเปรียบเทียบค่าระหว่างกันว่าเป็นจริงหรือเป็นเท็จ และสามารถนำค่าความจริงที่ได้มาใช้ประโยชน์ได้อย่างมากมายจากตัวอย่างต่อไปนี้ โดยการเปรียบเทียบมีอยู่ดังนี้คือ
มีน้อยกว่า ใช้เครื่องหมาย <
มีค่าน้อยกว่าหรือเท่าเท่า ใช้เครื่องหมาย <=
มีค่ามากกว่า ใช้เครื่องหมาย >
มีค่ามากกว่าหรือเท่ากับ ใช้เครื่องหมาย >=
มีค่าเท่ากัน ใช้เครื่องหมาย ==
มีค่าไม่เท่ากัน ใช้เครื่องหมาย !=
เช่นการเปลียนเทียบกันของเวคเตอร์
# 2 มากกว่า 3?
2 > 3
## [1] FALSE
# 5 น้อยกว่า 4?
5 < 4
## [1] FALSE
# 6 น้อยกว่าหรือเท่ากับ 7?
6<= 7
## [1] TRUE
# log(2) มากกว่าหรือเท่ากับ log(1)?
log(2)>=log(1)
## [1] TRUE
# TRUE เท่ากับ 1?
TRUE==1
## [1] TRUE
# FALSE ไม่เท่ากับ F
FALSE != F
## [1] FALSE
นักเรียนชายและหญิงมีอายุอยู่ระหว่าง 12-18 ปีโดยสุ่มขึ้นมา 10 คน ให้อายุนักเรียนชายมีชื่อตัวแปรว่า Male_Age และอายุนักเรียนหญิงมีชื่อตัวแปรว่า Female_Age
Age<-12:18
set.seed(100) # เป็นคำสั่งที่ทำให้หารสุ่มใหม่ทุกครั้ง จะได้ค่าเหมือนเดิมทุกครั้ง
Male_Age <- sample(Age,10,replace=TRUE) # สุ่มแบบคืนที่
Male_Age
## [1] 13 18 17 14 12 13 17 15 18 17
Female_Age <- sample(Age,10,replace=TRUE) # สุ่มแบบคืนที่
Female_Age
## [1] 17 15 18 17 13 18 18 18 14 13
ถ้าต้องทราบว่ามีนักเรียนชายที่อายุมากกว่า 15 ปีมีอายุเท่าไหร่บ้าง
Male_Age[Male_Age > 15]
## [1] 18 17 17 18 17
หรือจำนวนนักเรียนหญิงที่อายุน้อยกว่า 14 ปีมีอายุเท่าไหร่และมีกี่คน สามารถทำได้ดังนี้
Female_Age[Female_Age < 14]
## [1] 13 13
sum(Female_Age < 14)
## [1] 2
ถ้าต้องการเปรียบกันว่าอายุนักชายคนที่ 1มีอายุมากกว่านักเรียนหญิงคนที่ 1 จนถึง นักเรียนชายคนที่ 10 มีอายุมากกว่านักเรียนหญิงคนที่ 10 ทำได้ดังนี้
Male_Age > Female_Age
## [1] FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE
ถ้าต้องการเช็คว่า ค่าในตัวแปร เป็น ตัวอักษร หรือตัวเลข หรือตัวแปรชนิด factor หรือ ค่าในกรอบข้อมูลมีค่าหรือไม่(NA) หรือเป็นค่าว่าง(NULL) ทำได้ดังนี้
A <- 2
is.character(A) # A เป็นตัวอักษรใช่หรือไม่
## [1] FALSE
is.numeric(A) # A เป็นตัวตัวเลขใช่ฟรือไม่
## [1] TRUE
B <- "2"
is.character(B) # B เป็นตัวอักษรใช่หรือไม่
## [1] TRUE
C <- NA
is.na(C) # C มีค่าเป็น "NA" ใช่หรือไม่
## [1] TRUE
D <- NULL
is.null(D) # D มีค่าเป็น NUll ใช่หรือไม่
## [1] TRUE
E<-factor(c("a","b","c"))
is.factor(E) # E เป็นแฟกเตอร์ใช่หรือไม่
## [1] TRUE
การเช็คค่านี้ จะให้ค่าออกมาเป็นค่าความจริง TRUE หรือ FALSE
ในอาร์จะใช้ package “dplyr” หรือจะจะใช้ “tidyverse” ก็ได้
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
ให้ \(A\) และ \(B\) เป็นเซตโดยที่ \(A,B\in U\) เราเรียก \(U\) ว่าเอกภพสัมพัทธ์ ส่วนรวมมีนิยามดัวนี้ \[A\cup B=\lbrace x\in U\mid x\in A \vee x\in B \rbrace\] ตัวอย่าง ให้ \(A=\lbrace 1,2,3,4\rbrace, B=\lbrace 3,4,5,6\rbrace\) ดังนั้น \[A\cup B =\lbrace 1,2,3,4,5,6\rbrace\] คำสั่งในอาร์คือ union
A<-1:4
B<-3:6
union(A,B)
## [1] 1 2 3 4 5 6
ให้ \(A\) และ \(B\) เป็นเซตโดยที่ \(A,B\in U\) เราเรียก \(U\) ว่าเอกภพสัมพัทธ์ ส่วนร่วมมีนิยามดัวนี้ \[A\cup B=\lbrace x\in U\mid x\in A \vee x\in B \rbrace\] ตัวอย่าง จากข้างบนและ \(C=\lbrace 6,7,8,9\rbrace\) ถ้าหา \[\begin{align*} A\cap B&=\lbrace 3,4\rbrace\\ A\cap C&=\lbrace \rbrace \text{ หรือ }\emptyset\\ B\cap C&=\lbrace 6\rbrace \end{align*}\] คำสั่งในอาร์คือ intersect
C<-6:9
intersect(A,B)
## [1] 3 4
intersect(A,C)
## integer(0)
intersect(B,C)
## [1] 6
หมายเหตุ เนื่องจาก \(A\) และ \(C\) เป็นเวคเตอร์จำนวน เมื่อส่วนร่วมเท่ากับเซตว่างในอาร์ก็คือ integer(0) ให้ \(D=\lbrace a,b,c\rbrace\) เป็นตัวอักษร ดังนั้น
D<-c("a","b","c")
intersect(A,D)
## character(0)
character(0) คือก็เซตว่างเช่นกัน
เซตผลต่างสามารถนิยามได้ดังนี้ \[A\setminus B =\lbrace x\in U\mid x \in A \vee x \notin B\rbrace\] คำสั่งในอาร์คือ setdiff
setdiff(A,B)
## [1] 1 2
setdiff(B,A)
## [1] 5 6
setdiff(A,D)
## [1] 1 2 3 4
setdiff(D,A)
## [1] "a" "b" "c"
เป็นการพิจารณาว่าเซต \(A\) และ \(B\) มีสมาชิกเหมือนกันทั้งหมดหรือไม่นิยามดังนี้ \[A=B\Rightarrow\lbrace a,b\in U \mid\forall a\in A \Rightarrow a\in B \vee \forall b\in B \Rightarrow b\in A\] ในอาร์ จะเป็นการเปรียบทางตรรกะศาสตร์ ระหว่างเซต โดยให้ค่าของมาเป็น TRUE หรือ FALSE โดยใช้คำสั่ง setequal
setequal(A,A) # เซต A=A ?
## [1] TRUE
setequal(A,B) # เซต A=B ?
## [1] FALSE
setequal(A,C) # เซต A=C ?
## [1] FALSE
ถ้าเราสนใจว่า สมาชิกบางตัวในเซตที่เราสนใจหรือไม่? ผลของการตรวจสอบ จะให้ค่าเป็น TRUE หรือ FALSE โดยใช้คำสั่งดังนี้
# 2 เป็นสมาชิกของ a หรือไม่?
2 %in% A
## [1] TRUE
# 2 เป็นสมาชิกของ a หรือไม่? 3 เป็นสมาชิกของ a หรือไม่?
c(2,3) %in% A
## [1] TRUE TRUE
# ตัวอักษร a อยู่ใน D หรือไม่
"a" %in% D
## [1] TRUE