1. นำเข้าสู่การเรียนรู้ R
R เป็นภาษาคอมพิวเตอร์ภาษาหนึ่งที่ใช้ในการคำนวณทางสถิติ
ซึ่งมีความคล้ายคลึงกับภาษา
S ที่พัฒนาโดย Bell Laboratories เริ่มแรกนั้นโปรแกรม R
เขียนโดย Robert Gentleman ในกลางปี
1990 ตั้งแต่ปี1997 เป็นต้นมา R ได้รับการดูแลและจัดการโดยทีมงานหลักที่พัฒนา
R (R Development Core Team)
โดยที่ R เป็นโปรแกรมแบบเปิด (open-source)ที่ผู้ใช้สามารถดาวน์โหลดมาใช้ได้ไม่ยาก
โดยไม่เสียค่าใช้จ่าย และเป็นส่วนหนึ่ง
ในโครงการของ GNU การใช้ R
สามารถใช้ได้กับทั้งระบบปฏิบัติการ Unix, Macintosh และ Windows ข้อมูลต่างๆ เกี่ยวกับ R และตัวโปรแกรมสามารถดาวน์โหลดได้จากเว็บไซต์ http://www.r-project.org
R เป็นโปรแกรมที่ดีมากสำหรับใช้ในการเรียนรู้ทางสถิติ เนื่องจากสามารถทำให้ผู้เรียนเกิดความเข้าใจในกระบวนการทางสถิติได้ดียิ่งขึ้น นอกจาก R จะเหมาะกับนักศึกษาเพื่อใช้ในการเรียนรู้ทางสถิติแล้ว R ยังเหมาะกับนักวิจัยที่ใช้สถิติอีกด้วย อีกทั้งยังเป็นโปรแกรมที่มีความยืดหยุ่นในการวิเคราะห์ทางสถิติ จึงทำให้ผู้ใช้สามารถขยายกระบวนวิเคราะห์ออกไปได้ตามความต้องการ
2 ติดตั้งและเริ่มใช้ R
เราสามารถดาวน์โหลด R ได้จาก CRAN (Comprehensive R Archive Network)ที่
http://cran.r-project.org การติดตั้ง R สำหรับระบบปฏิบัติการวินโดว์ นั้นสามารถทำได้ไม่ยาก จากการ ดาวน์โหลดไฟล์ rwXXXX.exe เมื่อXXXX หมายถึง version ของ R ไฟล์นี้จะมีขนาดใหญ่กว่า 20 Mb สมมุติดาวน์โหลดและบันทึกไฟล์ดังกล่าวไว้ที่เดสท็อป เรียบร้อยแล้ว ให้ดับเบิลคลิกที่ไอคอนไฟล์ที่ดาวน์โหลดไว้ R จะถูกติดตั้ง ทันที เมื่อติดตั้ง R เรียบร้อยแล้ว เราสามารถเริ่มใช้งาน R ได้โดยดับเบิลคลิกไอคอนโปรแกรม R จะปรากฏหน้าต่างที่พร้อมใช้งานได้ สำหรับโปรแกรม R จะมีการปรับปรุงราว 6 เดือนครั้งหนึ่ง ที่เราสามารถที่จะอัฟเดทเพื่อใช้งานลักษณะใหม่ๆ
3 การใช้โปรแกรม R ในลักษณะต่างๆ
3.1 การใช้ R เป็นเครื่องคิดเลข
R เป็นโปรแกรมที่ดีมากสำหรับใช้ในการเรียนรู้ทางสถิติ เนื่องจากสามารถทำให้ผู้เรียนเกิดความเข้าใจในกระบวนการทางสถิติได้ดียิ่งขึ้น นอกจาก R จะเหมาะกับนักศึกษาเพื่อใช้ในการเรียนรู้ทางสถิติแล้ว R ยังเหมาะกับนักวิจัยที่ใช้สถิติอีกด้วย อีกทั้งยังเป็นโปรแกรมที่มีความยืดหยุ่นในการวิเคราะห์ทางสถิติ จึงทำให้ผู้ใช้สามารถขยายกระบวนวิเคราะห์ออกไปได้ตามความต้องการ
2 ติดตั้งและเริ่มใช้ R
เราสามารถดาวน์โหลด R ได้จาก CRAN (Comprehensive R Archive Network)ที่
http://cran.r-project.org การติดตั้ง R สำหรับระบบปฏิบัติการวินโดว์ นั้นสามารถทำได้ไม่ยาก จากการ ดาวน์โหลดไฟล์ rwXXXX.exe เมื่อXXXX หมายถึง version ของ R ไฟล์นี้จะมีขนาดใหญ่กว่า 20 Mb สมมุติดาวน์โหลดและบันทึกไฟล์ดังกล่าวไว้ที่เดสท็อป เรียบร้อยแล้ว ให้ดับเบิลคลิกที่ไอคอนไฟล์ที่ดาวน์โหลดไว้ R จะถูกติดตั้ง ทันที เมื่อติดตั้ง R เรียบร้อยแล้ว เราสามารถเริ่มใช้งาน R ได้โดยดับเบิลคลิกไอคอนโปรแกรม R จะปรากฏหน้าต่างที่พร้อมใช้งานได้ สำหรับโปรแกรม R จะมีการปรับปรุงราว 6 เดือนครั้งหนึ่ง ที่เราสามารถที่จะอัฟเดทเพื่อใช้งานลักษณะใหม่ๆ
3 การใช้โปรแกรม R ในลักษณะต่างๆ
3.1 การใช้ R เป็นเครื่องคิดเลข
การใช้ R แบบง่ายๆแบบหนึ่งคือการใช้เสมือนเป็นเครื่องคิดเลข R จะใช้เครื่องหมายทางคณิตศาสตร์ที่เราคุ้นเคยกันดี อยู่แล้ว เช่น +, -, * และ / และใช้เป็นเครื่องหมายของการยกกำลัง ตัวอย่างต่อไปนี้แสดงให้เห็นถึงการใช้
R เป็น เครื่องคิดเลข
> 2+2
[1] 4
> 2^2
[1] 4 > 2+2
[1] 4
> 2^2
> (1-2)*3
[1] -3
> -2*3
[1] -6
> -2*3
[1] -6
ผลที่ได้จากการคำนวณจะปรากฏในบรรทัดถัดมาพร้อมด้วย [1]
(จะอธิบายถึงสัญลักษณะนี้ต่อไปในเรื่องของ
data vector)
Functionsใน R
นั้นมีฟังก์ชันทางคณิตศาสตร์และสถิติที่เราสามารถนำมาใช้ได้มากมาย
และมีวิธีใช้ที่คล้ายคลึงกัน เวลาใช้เราจะพิมพ์ชื่อของฟังก์ชันที่ต้องการใช้
ตามด้วยวงเล็บ, ( ) ซึ่งในวงเล็บนี้เราจะใส่ arguments เข้าไป ดังตัวอย่างต่อไปนี้แสดงการใช้ฟังก์ชันใน R > sqrt(2)
[1] 1.414214
> sin(pi)
[1] 1.224606e-16
> exp(1)
[1] 2.718282
> log(10)
[1] 2.302585
ฟังก์ชันหลายฟังก์ชันใน R มี argument ที่นอกเหนือจากที่ใช้ไปแล้ว ซึ่งทำให้เราสามารถเปลี่ยน defualt ที่กำหนดไว้ ในฟังก์ชันได้ เช่น เนื่องจากฟังก์ชัน log() นั้นโดย default แล้วเป็น log ฐานe แต่ถ้าเราต้องการใช้ log ฐาน 10 สา มารทำได้ดังนี้
> log(10,base=10)
[1] 1
สำหรับคำสั่งแรกจะใช้ได้เมื่อเราทราบอยู่แล้วว่า argument ที่สองเป็นการกำหนดฐานของ log ในคำสั่งที่สองเราใช้ named argument, base=, บอกให้ฟังก์ชันทราบว่าเราต้องการใช้ log ฐาน 10 แบบแรกนั้นมีประโยชน์คือประหยัดเวลา ในการพิมพ์ แต่ในแบบที่สองนั้นง่ายต่อการจำและการอ่าน
3.2 การกำหนดค่า (Assignment)
โดยทั่วไปเราต้องการกำหนดค่าให้กับชื่อบางค่าเพื่อนำไปใช้ในคราวต่อไปได้โดยไม่ต้องพิมพ์ค่านั้นอีก เช่น
> x=2
> x+3
[1] 5
> e=exp(1)
> e^2
[1] 7.389056
การกำหนดชื่อตัวแปรนั้นสามารถใช้ได้ทั้งตัวอักษร ตัวเลข และ "." หรือ " " แต่ไม่สามารถใช้เครื่องหมายของการ คำนวณทางคณิตศาสตร์ เช่น +, -, *, / ได้ ตัวอย่างของการตั้งชื่อตัวแปร
> x=2
> n=25
> a.really.long.number = 123456789
> AReallySmallNumber = 0.000000001
การตั้งชื่อตัวแปรนั้น การใช้ตัวอักษรตัวใหญ่หรือตัวเล็ก Rจะถือว่าไม่ใช่ตัวแปรเดียวกัน
3.3 การใช้คำสั่ง c() เพื่อนำเข้าข้อมูล (Using c() to Enter Data)
โดยปกติข้อมูลชุดหนึ่งมักประกอบด้วยค่าจากการสังเกตหลายค่า และเราสามารถอ้างอิงถึงค่าที่สังเกตเหล่านั้นโดยการใช้ อินเด็ก(index) เช่นx1 ,x2 ,...,xn (ตัวเลข อินเด็ก 1,2 ..n แยกให้เห็นถึงตัวแปรย่อย) เมื่อ n เป็นจำนวนค่าครั้งที่สังเกต สมมุติว่าเรามีข้อมูลชุดหนึ่งประกอบด้วยค่าที่สังเกตดังนี้
2 5 4 3 6
เพื่อเก็บข้อมูลชุดนี้ใน R เราใช้ เว็คเตอร์ข้อมูล (data vector) ซึ่งสามารถเก็บข้อมูลลักษณะนี้โดยใช้ c() ดังนี้
> x = c(2,5,4,3,6)โดยทั่วไปเราต้องการกำหนดค่าให้กับชื่อบางค่าเพื่อนำไปใช้ในคราวต่อไปได้โดยไม่ต้องพิมพ์ค่านั้นอีก เช่น
> x=2
> x+3
[1] 5
> e=exp(1)
> e^2
[1] 7.389056
การกำหนดชื่อตัวแปรนั้นสามารถใช้ได้ทั้งตัวอักษร ตัวเลข และ "." หรือ " " แต่ไม่สามารถใช้เครื่องหมายของการ คำนวณทางคณิตศาสตร์ เช่น +, -, *, / ได้ ตัวอย่างของการตั้งชื่อตัวแปร
> x=2
> n=25
> a.really.long.number = 123456789
> AReallySmallNumber = 0.000000001
การตั้งชื่อตัวแปรนั้น การใช้ตัวอักษรตัวใหญ่หรือตัวเล็ก Rจะถือว่าไม่ใช่ตัวแปรเดียวกัน
3.3 การใช้คำสั่ง c() เพื่อนำเข้าข้อมูล (Using c() to Enter Data)
โดยปกติข้อมูลชุดหนึ่งมักประกอบด้วยค่าจากการสังเกตหลายค่า และเราสามารถอ้างอิงถึงค่าที่สังเกตเหล่านั้นโดยการใช้ อินเด็ก(index) เช่นx1 ,x2 ,...,xn (ตัวเลข อินเด็ก 1,2 ..n แยกให้เห็นถึงตัวแปรย่อย) เมื่อ n เป็นจำนวนค่าครั้งที่สังเกต สมมุติว่าเรามีข้อมูลชุดหนึ่งประกอบด้วยค่าที่สังเกตดังนี้
2 5 4 3 6
เพื่อเก็บข้อมูลชุดนี้ใน R เราใช้ เว็คเตอร์ข้อมูล (data vector) ซึ่งสามารถเก็บข้อมูลลักษณะนี้โดยใช้ c() ดังนี้
> x
[1] 2 5 4 3 6
เราสามารถแสดงค่าของข้อมูลโดยการพิมพ์ชื่อตัวแปรนั้น [1] เป็นการอ้างถึงค่าสังเกตที่
1 ถ้าข้อมูลมีมากกว่าหนึ่งแถว ตัวเลขนี้จะอ้างถึงค่าสังเกตที่หนึ่งของแถวนั้นๆ เราสามารถใช้ฟังก์ชัน c() ในการรวมเวกเตอร์ข้อมูลเข้าด้วยกันได้ เช่น
> x = c(1,2,3,4,5)> y = c(6,7,8,9,10)
> c(x,y)
[1] 1 2 3 4 5 6 7 8 9 10
ข้อจำกัดอย่างหนึ่งของเวกเตอร์ข้อมูลคือค่าที่ อยู่ในเวกเตอร์ทั้งหมดต้องเป็นข้อมูลประเภทเดียวกัน ซึ่งอาจเป็น ตัวเลข(numeric) หรือข้อความ (characters string) ก็ได้ เช่น
3.4 การใช้ฟังก์ชันกับเว็คเตอร์ข้อมูล (Using Functions on a Data Vector)
เมื่อเราเก็บข้อมูลในตัวแปรหนึ่งแล้ว เราสามารถใช้ฟังก์ชันกับตัวแปรนี้ได้ ฟังก์ชันเกือบทั้งหมดใน R สามารถทำงานได้กับเวกเตอร์ข้อมูล เช่น sum() จะหาผลรวมของค่าสังเกตทั้งหมดในเวกเตอร์ข้อมูล และ length() จะให้ค่าจำนวนค่า สังเกตทั้งหมดในเวกเตอร์ข้อมูล
> sum(x)
[1] 15
> length(x)
[1] 5
> sum(x)/length(x)
[1] 3
> mean(x)
[1] 3
จากคำสั่งที่ ใช้แสดงให้เห็นว่าเราสามารถคำนวณหาค่าเฉลี่ยของข้อมูลได้โดยการใช้ค่าผลรวมของข้อมูลหารด้วยขนาดของข้อมูลก็ได้ หรือหาจากการใช้ฟังก์ชัน mean() ก็ได้ R มีฟังก์ชันสำเร็จรูปอยู่มากมายหลายฟังก์ชัน ฟังก์ชันอื่นๆที่ มีประโยชน์และควรทราบคือ sort(), min(), range(), diff() และ cumsum()
[1] 1 2 3 4 5
> min(x)
[1] 1
> max(x)
[1] 5
> range(x)
[1] 1 5
> cumsum(x)
[1] 1
3 6 10 15 [1] 1 5
> cumsum(x)
นอกจากเราจะสามารถใช้ฟังก์ชันกับเวกเตอร์ได้แล้ว เรายังสามารถคำนวณกับเวกเตอร์ได้ด้วย เช่น
> weight.male = c(75, 80, 65, 95, 82)
> weight.female = c(50, 60, 45, 48, 55)
> weight.male + weight.female
[1] 125 140 110 143 137
> weight.male - weight.female
[1] 25 20 20 47 27
> mean(weight.male) - mean(weight.female)
[1] 27.8
ตัวอย่างที่ 1.1 การเขียนโปรแกรมคำนวณค่าความแปรปรวนของข้อมูลชุดหนึ่
งจากสูตร> weight.female = c(50, 60, 45, 48, 55)
> weight.male + weight.female
[1] 125 140 110 143 137
> weight.male - weight.female
[1] 25 20 20 47 27
> mean(weight.male) - mean(weight.female)
[1] 27.8
> xbar = mean(x)
> x - xbar
[1] -3.6 -2.6 -0.6 1.4 5.4
> (x - xbar)^2
[1] 12.96 6.76 0.36 1.96 29.16
> sum((x-xbar)^2)
[1] 51.2
> n = length(x)
>n > x - xbar
[1] -3.6 -2.6 -0.6 1.4 5.4
> (x - xbar)^2
[1] 12.96 6.76 0.36 1.96 29.16
> sum((x-xbar)^2)
[1] 51.2
> n = length(x)
[1] 5
> sum((x-xbar)^2)/(n-1)
[1]
12.8
> var(x) # use function var()
to obtain the
variance of x [1] 12.8
3.5 การสร้างข้อมูลแบบโครงสร้างCreating Structured Data
ในบางครั้งข้อมูลของเรามีลักษณะที่เป็นรูปแบบบางอย่าง เช่น เป็นเลขจำนวนเต็ม 1 ถึง 99
เพื่อเก็บข้อมูลแบบนี้ใน R ทีละค่าเป็นการเสียเวลามาก
อย่างไรก็ตาม R มีวิธีเก็บข้อมูลชนิดนี้ได้ง่ายๆดังนี้ ข้อมูลการจัดลำดับอย่างง่าย (Simple sequences) ถ้าค่าของข้อมูลที่ต้องการเก็บมีค่าเป็นลำดับจาก 1 ถึง 99 และ จาก 99 ถึง 1 โดยที่แต่ละค่าห่างกันเท่ากับ 1 เขียนคำสั่งได้คือ
[1]
1 2 3 4 5 6 7 8
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 [26] 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
42 43 44 45 46 47 48 49 50 [51] 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
67 68 69 70 71 72 73 74 75 [76] 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
92 93 94 95 96 97 98 99
> rev(1:99)
[1] 99 98 97 96 95 94 93 92 91 90 89 88 87 86 85 84 83 82 81 80 79 78 77 76 75 [26] 74 73 72 71 70 69 68 67 66 65 64 63 62 61 60 59 58 57 56 55 54 53 52 51 50 [51] 49 48 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 [76] 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
ข้อมูลการจัดลำดับเลขคณิต (Arithmetic sequences)
หากค่าของข้อมูลมีการเรียงลำดับกันในรูปแบบทางคณิตศาสตร์ โดยมีค่าเริ่มต้นคือ a มีระยะ ห่างระหว่างแต่ละค่าคือ h และมีจำนวนทั้งหมดเท่ากับn ลำดับคือ
a, a+
h, a+ 2h, a+ 3h, .
. . , a+ (n-1)h > rev(1:99)
[1] 99 98 97 96 95 94 93 92 91 90 89 88 87 86 85 84 83 82 81 80 79 78 77 76 75 [26] 74 73 72 71 70 69 68 67 66 65 64 63 62 61 60 59 58 57 56 55 54 53 52 51 50 [51] 49 48 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 [76] 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
ข้อมูลการจัดลำดับเลขคณิต (Arithmetic sequences)
หากค่าของข้อมูลมีการเรียงลำดับกันในรูปแบบทางคณิตศาสตร์ โดยมีค่าเริ่มต้นคือ a มีระยะ ห่างระหว่างแต่ละค่าคือ h และมีจำนวนทั้งหมดเท่ากับn ลำดับคือ
> a = 1;h=4; n=5
> a + h*(0:(n-1))
[1] 1 5 9 13 17
เราสามารถใช้ฟังก์ชัน seq() ในการสร้างเวกเตอร์ข้อมูลโดยการระบุค่าเริ่มต้นและค่าสุดท้าย พร้อมทั้ง ระยะห่างของ แต่ละค่าได้ดังนี้
> seq(1,9,by=2) # odd numbers
[1] 1 3 5 7 9
> seq(1,10,by=2) # as 11 > 10 it is not included
[1] 1 3 5 7 9
> seq(1,9,length=5) # 5 numbers only
[1] 1 3 5 7 9
> seq(1,10,by=2) # as 11 > 10 it is not included
[1] 1 3 5 7 9
> seq(1,9,length=5) # 5 numbers only
[1]
1
3 5 7 9
ข้อมูลจัดจำนวนเลขซ้ำ(Repeated
numbers)
เมื่อเวกเตอร์ข้อมูลประกอบด้วยค่าที่ ซ้ำๆกัน เราสามารถใช้ฟังก์ชัน rep() ในการเก็บข้อมูลได้ ดังนี้
> rep(1,10) เมื่อเวกเตอร์ข้อมูลประกอบด้วยค่าที่ ซ้ำๆกัน เราสามารถใช้ฟังก์ชัน rep() ในการเก็บข้อมูลได้ ดังนี้
[1]1111111111
> rep(1:3,3)
[1] 1 2 3 1 2 3 1 2 3
รูปแบบของการเก็บข้อมูลที่มีลักษณะซ้ำๆกัน ที่ซับซ้อนขึ้นทำได้โดยการกำหนดคู่ของเวกเตอร์ที่มีขนาดเท่ากัน ดังนี้
[1] "long" "short" "short"
3.6 ดำเนินการข้อมูลโดยใช้ดัชนี (Accessing Data by Using Indices)
ใน R เราสามารถเข้าถึงค่าสังเกตที่อยู่ในเวกเตอร์ข้อมูลได้ง่ายๆโดยใช้ [i] เมื่อ i คือ index ของข้อมูล เช่น ข้อมูลชุดหนึ่งประกอบด้วย x1 ,x2 ,...,xn เราสามารถเข้าถึงค่ าสังเกตแต่ ละค่าได้โดยใช้x[1],x[2],...,x[n] ตามลำดับ
> x =
c(2,4,6,8,10)
> x[2]
[1] 4
> x[length(x)]
[1] xx10
เราสามารถเข้าถึงค่าสังเกตมากกว่าหนึ่งค่าได้พร้อมๆกันดังนี้
> x[1:3]
[1] 2 4 6
> x[c(1,3,5)]
[1] 2 6 10
ถ้าเราต้องการเข้าถึงค่าในบางกรณี
> x[-1] #ไม่เอาค่าที่ 1
[1] 4 6 8 10
> x[-(1:3)] #ไม่เอาค่าที่ 1-3
[1] 8 10
> x[c(-1,-3,-5)] #กำหนดที่ไม่มีลำดับที่ 1,3,5
[1] 4 8
นอกจากที่กล่าวมาแล้ว เรายังสามารถเข้าถึงค่าสังเกตในเวกเตอร์ได้โดยการใช้ชื่อดังนี้> x[2]
[1] 4
> x[length(x)]
[1] xx10
เราสามารถเข้าถึงค่าสังเกตมากกว่าหนึ่งค่าได้พร้อมๆกันดังนี้
> x[1:3]
[1] 2 4 6
> x[c(1,3,5)]
[1] 2 6 10
ถ้าเราต้องการเข้าถึงค่าในบางกรณี
> x[-1] #ไม่เอาค่าที่ 1
[1] 4 6 8 10
> x[-(1:3)] #ไม่เอาค่าที่ 1-3
[1] 8 10
> x[c(-1,-3,-5)] #กำหนดที่ไม่มีลำดับที่ 1,3,5
[1] 4 8
> names(x) = c("one", "two", "three") # set the names
> x["one"]
1
3.7 การกำหนดค่าให้กับเว็คเตอร์ข้อมูล (Assigning Values to Data Vector)
เราสามารถใส่ค่าของข้อมูลในแต่ละสมาชิกในเวกเตอร์ข้อมูลได้โดยการใช้
index โดยมีวิธีง่ายๆคือ x[i] = a
คำสั่งนี้จะทำให้สมาชิกที่ i
ของเวกเตอร์ x
มีค่าเท่ากับ a ถ้าหากสมาชิกที่ i มีค่ามากกว่าขนาดของ x[i] เดิมจะทำให้เวกเตอร์เพิ่มขนาดขึ้น>x
[1] 3 4 6 8 10
นอกจากนั้นเรายังสามารถใส่ ค่ าของข้อมูลลงในเวกเตอร์ข้อมูลได้มากกว่ าหนึ่งค่าในคราวเดียวกัน ดังนี้
> x[6:10] = c(12,14,16,18,20)
# ใส่ค่าต่อจากค่าที่ 5
ไปถีงค่าที่ 10
>x[1] 3 4 6 8 10 12 14 16 18 20
ถ้าค่าของข้อมูลที่ต้องการใส่ลงไปในเวกเตอร์ข้อมูลมีจำนวนน้อยกว่า
index ที่กำหนดไว้ (ขนาดของเวกเตอร์ใหญ่กว่า
จำนวนข้อมูล) R
จะนำข้อมูลที่ใช้ไปแล้วมาวนใส่ลงในเวกเตอร์
3.8 ค่าทางตรรก (Logical
Values)
การแสดงผลของ R ในรูปของ TRUE และ FALSE เรียกว่า นิพจน์ทางตรรก(logical expression) ใน R จะใช้คำ TRUE
และ FALSE
เพื่อชี้ให้เห็นถึงสิ่งที่ถูกต้องตามเงื่อนไขหรือสิ่งที่ผิดไม่ตรงตามเงื่อนไข
(สามารถใช้ T หรือ F แทนได้)
> x
[1] 3 4 6 8 10 12 14 16 18 20
> x > 10
[1] FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE
> x[x > 10] # values bigger than 10
[1] 12 14 16 18 20
> which(x > 10) # which indices บอกตำแหน่งข้อมูล
[1] 6 7 8 9 10
ฟังก์ชัน which() เป็นการบอกตำแหน่งของข้อมูลที่ มีค่าตรงตามเงื่อนไขในเวกเตอร์ข้อมูล ยังมีฟังก์ชันอื่นๆอีกบางฟังก์ชันที่สามารถนำมาใช้ร่วมกับ logical vector โดยเฉพาะฟังก์ชัน sum() ซึ่งจะเป็นการรวมจำนวนค่าที่เป็น TRUE โดยให้ค่า TRUE เป็น 1 และให้ค่า FALSE เป็ น 0 ฟังก์ชันนี้มีประโยชน์มากในการหาจำนวนนับ (counts) และสัดส่วนข้อมูลให้เต็ม หรือหากจำนวนข้อมูลที่ต้องการใส่มากกว่า
> sum(x > 10) #
number bigger than 10 จำนวณที่มากกว่าค่า 10> x
[1] 3 4 6 8 10 12 14 16 18 20
> x > 10
[1] FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE
> x[x > 10] # values bigger than 10
[1] 12 14 16 18 20
> which(x > 10) # which indices บอกตำแหน่งข้อมูล
[1] 6 7 8 9 10
ฟังก์ชัน which() เป็นการบอกตำแหน่งของข้อมูลที่ มีค่าตรงตามเงื่อนไขในเวกเตอร์ข้อมูล ยังมีฟังก์ชันอื่นๆอีกบางฟังก์ชันที่สามารถนำมาใช้ร่วมกับ logical vector โดยเฉพาะฟังก์ชัน sum() ซึ่งจะเป็นการรวมจำนวนค่าที่เป็น TRUE โดยให้ค่า TRUE เป็น 1 และให้ค่า FALSE เป็ น 0 ฟังก์ชันนี้มีประโยชน์มากในการหาจำนวนนับ (counts) และสัดส่วนข้อมูลให้เต็ม หรือหากจำนวนข้อมูลที่ต้องการใส่มากกว่า
[1] 5
> sum(x > 10)/length(x) # proportion bigger than 10 สัดส่วนที่ค่ามากกว่า 10
[1] 0.5
การสร้างเวคเตอร์ข้อมูลทางตรรกตามเงื่อนไข(Creating
logical vectors by conditions)> sum(x > 10)/length(x) # proportion bigger than 10 สัดส่วนที่ค่ามากกว่า 10
[1] 0.5
เราสามารถสร้าง logical vectors ได้โดยตรงโดยการใช้
c() หรือได้จากผลลัพธ์ที่เกิดจากการสร้างเงื่อนไข
โดยมี logical
operators คือ<, <=, >,=>,== และ! = ซึ่งเครื่องหมายส่วนใหญ่เรารู้จักกันดีอยู่แล้ว
แต่มีบางเครื่องหมายที่เราอาจยังไม่เคยใช้ ได้แก่ == ใช้แทนเครื่องหมายเท่ากับ ! = ใช้แทนไม่เท่ากับ ส่วนเครื่องหมาย!
จะเปลี่ยนค่าของ ข้อมูลให้เป็น logical
vector
นอกจากนั้นเรายังสามารถเปรียบเทียบ logical vectors ได้โดยใช้ "and, &" และ "or, | " การใช้เครื่องหมาย แบบนี้เป็นการเปรียบเทียบสมาชิกแต่ละสมาชิกในแต่ละเวกเตอร์ ผลของการเปรียบจะออกมาเป็นเวกเตอร์หนึ่ง อีกรูปแบบหนึ่งของการเปรียบเทียบคือ && และ | | เพื่อตรวจสอบค่าจากซ้ายไปขวาจนกระทั่งได้ TRUE หรือ FALSE และผลที่ได้ จะได้ค่าเพียงค่าเดียว
นอกจากนั้นเรายังสามารถเปรียบเทียบ logical vectors ได้โดยใช้ "and, &" และ "or, | " การใช้เครื่องหมาย แบบนี้เป็นการเปรียบเทียบสมาชิกแต่ละสมาชิกในแต่ละเวกเตอร์ ผลของการเปรียบจะออกมาเป็นเวกเตอร์หนึ่ง อีกรูปแบบหนึ่งของการเปรียบเทียบคือ && และ | | เพื่อตรวจสอบค่าจากซ้ายไปขวาจนกระทั่งได้ TRUE หรือ FALSE และผลที่ได้ จะได้ค่าเพียงค่าเดียว
> x =
1:5
> x < 5 # is x less than 5
[1] TRUE TRUE TRUE TRUE FALSE
> x > 1 # is x more than 1
[1] FALSE TRUE TRUE TRUE TRUE
> x > 1 & x < 5 # is x bigger than 1 and less than 5
[1] FALSE TRUE TRUE TRUE FALSE
> x > 1 && x < 5 # First one is false
[1] FALSE
> x > 1 | x < 5 # is x bigger than 1 or less than 5
[1] TRUE TRUE TRUE TRUE TRUE
> x > 1 || x < 5 # First one true
[1] TRUE
> x == 3 # is x equal to 3
[1] FALSE FALSE TRUE FALSE FALSE
> x != 3 # is x not equal to 3
[1] TRUE TRUE FALSE TRUE TRUE
> ! x == 3 # not (x equal to 3)
[1] TRUE TRUE FALSE TRUE TRUE
3.9 ค่าที่หายไป (Missing Values)> x < 5 # is x less than 5
[1] TRUE TRUE TRUE TRUE FALSE
> x > 1 # is x more than 1
[1] FALSE TRUE TRUE TRUE TRUE
> x > 1 & x < 5 # is x bigger than 1 and less than 5
[1] FALSE TRUE TRUE TRUE FALSE
> x > 1 && x < 5 # First one is false
[1] FALSE
> x > 1 | x < 5 # is x bigger than 1 or less than 5
[1] TRUE TRUE TRUE TRUE TRUE
> x > 1 || x < 5 # First one true
[1] TRUE
> x == 3 # is x equal to 3
[1] FALSE FALSE TRUE FALSE FALSE
> x != 3 # is x not equal to 3
[1] TRUE TRUE FALSE TRUE TRUE
> ! x == 3 # not (x equal to 3)
[1] TRUE TRUE FALSE TRUE TRUE
ในบางครั้งข้อมูลบางค่านั้นไม่สามารถหาค่าได้หรือสูญหายไป ใน R
จะใช้ค่า NA แทนค่าที่สูญหาย ในการทำงานของเวกเตอร์ข้อมูลที่มีค่า
NA อยู่ R
จะทำเสมือนว่าไม่มีค่านี้อยู่ในเวกเตอร์
เช่น การบวกกับค่า
NA จะได้ค่าออกมาเป็น NA นั่นคือไม่สามารถบวกได้นั่นเอง
สำหรับการตรวจสอบว่าในเวกเตอร์ข้อมูลมีค่าใดเป็น NA ทำได้โดยใช้ฟังก์ชัน is.na() เช่น
> y = c(0,1,0,NA,0,0)
> y
[1] 0 1 0 NA 0 0
> y > 0 # note NA is answer
[1] FALSE TRUE FALSE NA FALSE FALSE
> is.na(y)
[1] FALSE FALSE FALSE TRUE FALSE FALSE
> mean(y) # Can’t add to get the mean
[1] NA
> mean(y,na.rm=TRUE) # na.rm means remove NA
[1] 0.2
> mean(y[!is.na(y)]) # hard way
[1] 0.2
ฟังก์ชันหลายฟังก์ชันใน R มี argument na.rm= ซึ่งสามารถเซตให้เป็น TRUE เพื่อกำจัด NA ออกไปได้ มีวิธีที่สามารถจัดการกับค่าที่หายไปได้อีกวิธีหนึ่งคือการใช้โครงสร้าง
เช่น x[!is.na(x)]> y = c(0,1,0,NA,0,0)
> y
[1] 0 1 0 NA 0 0
> y > 0 # note NA is answer
[1] FALSE TRUE FALSE NA FALSE FALSE
> is.na(y)
[1] FALSE FALSE FALSE TRUE FALSE FALSE
> mean(y) # Can’t add to get the mean
[1] NA
> mean(y,na.rm=TRUE) # na.rm means remove NA
[1] 0.2
> mean(y[!is.na(y)]) # hard way
[1] 0.2
เมื่อเราเปิดโปรแกรมและทำงานในโปรแกรมไประยะเวลาหนึ่ง
เราจะพบว่ามีตัวแปรที่เรากำหนดไว้มากมายจนเราไม่
สามารถจดจำได้ทั้งหมด
เราสามารถใช้ฟังกชัน ls()
และ objects() แสดงตัวแปร,
ฟังก์ชัน, และสิ่งอื่นๆทั้งหมดที่เรา ใช้บนหน้าจอได้
หากเราต้องการลบตัวแปรหรือสิ่งที่เราใช้ออกไปเพื่อลดขนาดของ work environment ลง สามารถทำได้โดยใช้ ฟังก์ชัน rm()หรือ remove()
3.11 การอ่านค่าข้อมูลจากแหล่งข้อมูลอื่น (Reading in Other Sources of Data)หากเราต้องการลบตัวแปรหรือสิ่งที่เราใช้ออกไปเพื่อลดขนาดของ work environment ลง สามารถทำได้โดยใช้ ฟังก์ชัน rm()หรือ remove()
การป้อนค่าของข้อมูลลงใน
R ทีละค่า หรือทุกครั้งที่ต้องใช้ข้อมูลชุดหนึ่งเป็นเรื่องน่าเบื่อ
และยังทำให้เกิดความผิดพลาดได้ง่าย ถ้าข้อมูลชุดนั้นมีการเก็บไว้ในแฟ้มข้อมูลบางประเภทอยู่แล้ว
เราควรใช้วิธีอ่านข้อมูลชุดนั้นเข้ามาใช้ วิธีอ่านข้อมูลเข้ามาใน R นั้นขึ้นอยู่กับชนิดของแฟ้มข้อมูลนั้น
โดยทั่วไปข้อมูลที่มีอยู่บน web
pages มักอยูในรูปของ text files, spreadsheets หรือโครงสร้างที่ใช้โปรแกรม R ได้
การใช้ไลบรารีและชุดข้อมูลที่ให้มาใน R (Using R’s Built-in Libraries and Data Sets)
R เป็นโปรแกรมที่ออกแบบมาให้มีเฉพาะส่วนที่สำคัญๆ
และให้ทำงานร่วมกับฟังก์ชันที่สามารถเพิ่มเข้าไปในโปรแกรม ได้โดยฟังก้ชันเหล่านี้ได้มาจาก
external packages ที่สำคัญกว่านั้นก็คือมี libraries
มากมายที่ขยายออกไปจากฟังก์ชัน พื้นฐานที่มีอยู่ใน R ซึ่ง libraries และ packages ส่วนใหญ่นั้นจะได้มาพร้อมอยู่แล้วเมื่อเรา
install โปรแกรม R ส่วนที่ นอกเหนือจากนี้สามารถ
download ได้จาก http://WWW.r-project.org
หากเราต้องการใช้ packages เหล่านี้ทำได้โดยใช้ฟังก์ชัน library() หรือ require() เช่น เราต้องการใช้ package pkgname ให้ใช้ library(pckname) สำหรับบนระบบปฏิบัติการ Windows เราสามารถเรียก packages ได้จาก menu bar ใน packages ส่วนใหญ่มักมี built-in data sets อยู่ซึ่งเราสามารถเรียกดูหรือเรียกใช้ data sets เหล่านี้ได้ ดังนี้
หากเราต้องการใช้ packages เหล่านี้ทำได้โดยใช้ฟังก์ชัน library() หรือ require() เช่น เราต้องการใช้ package pkgname ให้ใช้ library(pckname) สำหรับบนระบบปฏิบัติการ Windows เราสามารถเรียก packages ได้จาก menu bar ใน packages ส่วนใหญ่มักมี built-in data sets อยู่ซึ่งเราสามารถเรียกดูหรือเรียกใช้ data sets เหล่านี้ได้ ดังนี้
> library(MASS)
> data(survey)
หรือใช้
> data(survey, package="MASS")
แต่คำสั่งนี้จะไม่เรียก help files มาให้ ซึ่งใน help files ของแฟ้มข้อมูลนั้นมักมีการอธิบายถึงลักษณะและความหมายของข้อมูลไว้ด้วย
การจัดการตัวแปรในชุดข้อมูล Accessing the Variables in a data set:$, attach(), and with()
ในชุดข้อมูล(data set )ชุดหนึ่งอาจประกอบด้วยตัวแปรเพียงตัวเดียว หรือหลายตัวก็ได้ และมักเก็บอยู่ในรูปของ data frame มีลักษณะคล้าย spreadsheet นั่นคือแต่ละคอลัมน์คือตัวแปรหนึ่ง โดยที่แต่ละแถวคือข้อมูลของตัวอย่างหนึ่ง หรือ หน่วยทดลองหนึ่ง เราสามารถเข้าถึงค่าข้อมูลได้โดยชื่อของคอลัมน์โดยระบุชื่อของ data frame ก่อนดังนี้
> library(MASS)
> names(geyser)
[1] "waiting" "duration"
> geyser$waiting
[1] 80 71 57 80 75 77 60 86 77 56 81 50 89 54 90 73 60 83
[19] 65 82 84 54 85 58 79 57 88 68 76 78 74 85 75 65 76 58
[37] 91 50 87 48 93 54 86 53 78 52 83 60 87 49 80 60 92 43
...
การที่ต้องพิมพ์ชื่อ data frame ทุกครั้งที่ต้องการเข้าถึงตัวแปรนั้นเป็นเรื่องเสียเวลาอย่างมาก มีวิธีหลายวิธีที่สามารถหลีกเลี่ยงปัญหานี้ได้ วิธีที่สะดวกที่สุดคือใช้ฟังก์ชัน attach() เพื่อบอกให้ R ทราบว่าเราต้องการทำงานกับ data frame นี้ และเราสามารถยกเลิกคำสั่งนี้ได้โดยใช้ detach() วิธีนี้เป็นวิธีที่ดีมากเมื่อเราทำงานโดยพิมพ์คำสั่งการทำงานต่างๆ บน R โดยตรง อย่างไรก็ตามวิธีนี้มีข้อเสียคืออาจก่อให้เกิดความสับสนได้ถ้าเราต้องการเปลี่ยนค่าในชุดข้อมูล หรือ ต้องการใช้ตัวแปรอื่นที่มีชื่อเดียวกันกับตัวแปรที่อยู่ในข้อมูลชุดที่เรา attach วิธีแก้ปัญหาคือใช้ฟังก์ชัน with() ซึ่งเป็ น การทำงานทั้ง attach() และ detach() ในคราวเดียวกัน โดยมีรูปแบบดังนี้
with(data.frame, command)
สำหรับ argument command นั้นสามารถประกอบด้วยหนึ่งคำสั่งหรือมากกว่าก็ได้ ถ้ามีมากกว่าหนึ่งคำสั่งให้คลุมคำสั่งเหล่านั้นด้วยวงเล็บ ( )
> data(Sitka) # load data set, optional นำเข้าชุดข้อมูล
> names(Sitka) # Variablse names ชื่อตัวแปร
> data(survey)
หรือใช้
> data(survey, package="MASS")
แต่คำสั่งนี้จะไม่เรียก help files มาให้ ซึ่งใน help files ของแฟ้มข้อมูลนั้นมักมีการอธิบายถึงลักษณะและความหมายของข้อมูลไว้ด้วย
การจัดการตัวแปรในชุดข้อมูล Accessing the Variables in a data set:$, attach(), and with()
ในชุดข้อมูล(data set )ชุดหนึ่งอาจประกอบด้วยตัวแปรเพียงตัวเดียว หรือหลายตัวก็ได้ และมักเก็บอยู่ในรูปของ data frame มีลักษณะคล้าย spreadsheet นั่นคือแต่ละคอลัมน์คือตัวแปรหนึ่ง โดยที่แต่ละแถวคือข้อมูลของตัวอย่างหนึ่ง หรือ หน่วยทดลองหนึ่ง เราสามารถเข้าถึงค่าข้อมูลได้โดยชื่อของคอลัมน์โดยระบุชื่อของ data frame ก่อนดังนี้
> library(MASS)
> names(geyser)
[1] "waiting" "duration"
> geyser$waiting
[1] 80 71 57 80 75 77 60 86 77 56 81 50 89 54 90 73 60 83
[19] 65 82 84 54 85 58 79 57 88 68 76 78 74 85 75 65 76 58
[37] 91 50 87 48 93 54 86 53 78 52 83 60 87 49 80 60 92 43
...
การที่ต้องพิมพ์ชื่อ data frame ทุกครั้งที่ต้องการเข้าถึงตัวแปรนั้นเป็นเรื่องเสียเวลาอย่างมาก มีวิธีหลายวิธีที่สามารถหลีกเลี่ยงปัญหานี้ได้ วิธีที่สะดวกที่สุดคือใช้ฟังก์ชัน attach() เพื่อบอกให้ R ทราบว่าเราต้องการทำงานกับ data frame นี้ และเราสามารถยกเลิกคำสั่งนี้ได้โดยใช้ detach() วิธีนี้เป็นวิธีที่ดีมากเมื่อเราทำงานโดยพิมพ์คำสั่งการทำงานต่างๆ บน R โดยตรง อย่างไรก็ตามวิธีนี้มีข้อเสียคืออาจก่อให้เกิดความสับสนได้ถ้าเราต้องการเปลี่ยนค่าในชุดข้อมูล หรือ ต้องการใช้ตัวแปรอื่นที่มีชื่อเดียวกันกับตัวแปรที่อยู่ในข้อมูลชุดที่เรา attach วิธีแก้ปัญหาคือใช้ฟังก์ชัน with() ซึ่งเป็ น การทำงานทั้ง attach() และ detach() ในคราวเดียวกัน โดยมีรูปแบบดังนี้
with(data.frame, command)
สำหรับ argument command นั้นสามารถประกอบด้วยหนึ่งคำสั่งหรือมากกว่าก็ได้ ถ้ามีมากกว่าหนึ่งคำสั่งให้คลุมคำสั่งเหล่านั้นด้วยวงเล็บ ( )
> data(Sitka) # load data set, optional นำเข้าชุดข้อมูล
> names(Sitka) # Variablse names ชื่อตัวแปร
[1]
"size"
"Time"
"tree"
"treat"
> tree # not visible
Error: Object "tree" not found
> length(Sitka$tree) # length
[1] 395
> with(Sitka, range(tree)) # what is range
[1] 1 79
> attach(Sitka)
> summary(tree)
Min. 1st Qu. Median Mean 3rd Qu. Max.
1 20 40 40 60 79
วิธีการอื่นสำหรับการนำข้อมูลเข้า (Other Methods of Data Entry)
1.ตัดและวาง (Cut and Paste)
หากเรามีข้อมูลที่ถูกเก็บไว้ในโปรแกรมอื่นๆ หรือไฟล์อื่นๆ เราสามารถใช้วิธี cut and paste ในการเก็บข้อมูลใน R หากข้อมูลนั้นมีแบ่งคอลัมน์ไว้แล้วเราสามารถ cut ข้อมูลที่ต้องการแล้วนำมาใส่ไว้ใน c() แต่ถ้าข้อมูลไม่มีการแบ่งคอลัมน์ไว้เราสามารถใช้ฟังก์ชันนี้ได้ อย่างไรก็ตามเราสามารถใช้ฟังก์ชัน scan() แทนได้ซึ่ง ฟังก์ชันนี้จะอ่าน ข้อมูลเข้ามาจนกระทั่งเราใส่บรรทัดว่างให้
2.การใช้ source() ในการอ่านข้อมูล Using source() to Read in R commands
เราสามารถใช้ฟังก์ชัน dump() เพื่อบันทึกค่ าของ R objects ลงใน text file ได้ เช่น dump("x","somefile.txt") จะเขียนรายละเอียดของตัวแปร x ลงในไฟล์ชื่อ somefile.txt ที่ อยู่ในไดเรกทอรีที่ ทำงานอยู่ในขณะนั้น หากต้องการ ทราบว่าเรากำลังทำงานอยู่ ในไดเรกทอรีอะไรให้ใช้ฟังก์ชัน getwd() หากต้องการเรียก output จากฟังก์ชัน dump() ให้ใช้ฟังก์ชัน source() ซึ่งจะช่วยให้เราถ่ายโอนชุดข้อมูลจาก session หนึ่งไปยัง session อื่นๆได้
ฟังก์ชัน source() สามารถใช้เรียกไฟล์คำสั่ง (command file) ได้และทำงานเสมือนว่าเราพิมพ์คำสั่งเหล่านั้นที่ prompt โดยตรง วิธีนี้ทำให้เราสามารถเขียนไฟล์คำสั่งที่ประกอบด้วยชุดคำสั่งโดยใช้ text editor และอ่านคำสั่ง เหล่านั้นเข้ามาใน R session เพื่อทำงานได้ นอกจากนั้นยังเป็นการง่ายต่อการแก้ไขคำสั่งที่ใช้ และยังสามารถ นำมาใช้ได้อีกในอนาคตอีกด้วย "
> tree # not visible
Error: Object "tree" not found
> length(Sitka$tree) # length
[1] 395
> with(Sitka, range(tree)) # what is range
[1] 1 79
> attach(Sitka)
> summary(tree)
Min. 1st Qu. Median Mean 3rd Qu. Max.
1 20 40 40 60 79
1.ตัดและวาง (Cut and Paste)
หากเรามีข้อมูลที่ถูกเก็บไว้ในโปรแกรมอื่นๆ หรือไฟล์อื่นๆ เราสามารถใช้วิธี cut and paste ในการเก็บข้อมูลใน R หากข้อมูลนั้นมีแบ่งคอลัมน์ไว้แล้วเราสามารถ cut ข้อมูลที่ต้องการแล้วนำมาใส่ไว้ใน c() แต่ถ้าข้อมูลไม่มีการแบ่งคอลัมน์ไว้เราสามารถใช้ฟังก์ชันนี้ได้ อย่างไรก็ตามเราสามารถใช้ฟังก์ชัน scan() แทนได้ซึ่ง ฟังก์ชันนี้จะอ่าน ข้อมูลเข้ามาจนกระทั่งเราใส่บรรทัดว่างให้
2.การใช้ source() ในการอ่านข้อมูล Using source() to Read in R commands
เราสามารถใช้ฟังก์ชัน dump() เพื่อบันทึกค่ าของ R objects ลงใน text file ได้ เช่น dump("x","somefile.txt") จะเขียนรายละเอียดของตัวแปร x ลงในไฟล์ชื่อ somefile.txt ที่ อยู่ในไดเรกทอรีที่ ทำงานอยู่ในขณะนั้น หากต้องการ ทราบว่าเรากำลังทำงานอยู่ ในไดเรกทอรีอะไรให้ใช้ฟังก์ชัน getwd() หากต้องการเรียก output จากฟังก์ชัน dump() ให้ใช้ฟังก์ชัน source() ซึ่งจะช่วยให้เราถ่ายโอนชุดข้อมูลจาก session หนึ่งไปยัง session อื่นๆได้
ฟังก์ชัน source() สามารถใช้เรียกไฟล์คำสั่ง (command file) ได้และทำงานเสมือนว่าเราพิมพ์คำสั่งเหล่านั้นที่ prompt โดยตรง วิธีนี้ทำให้เราสามารถเขียนไฟล์คำสั่งที่ประกอบด้วยชุดคำสั่งโดยใช้ text editor และอ่านคำสั่ง เหล่านั้นเข้ามาใน R session เพื่อทำงานได้ นอกจากนั้นยังเป็นการง่ายต่อการแก้ไขคำสั่งที่ใช้ และยังสามารถ นำมาใช้ได้อีกในอนาคตอีกด้วย "
ฟังก์ชันที่แก้ไขใหม่นี้สามารถรับ argument ได้ เช่น
3.Reading Data From Formatted Data Sources
เรามักพบไฟล์ข้อมูลที่มีรูปแบบที่ แน่นอนบางอย่าง เช่น ไฟล์ของข้อมูลที่ เป็นตัวเลข, เป็นตารางของตัวเลข หรือ เป็นไฟล์ที่แยกตัวเลขแต่ละค่าด้วยเครื่องหมาย "," ซึ่ง R มีวิธีในการอ่านไฟล์แต่ละรูปแบบดังนี้
ถ้าข้อมูลชุดหนึ่งถูกเก็บไว้ในไฟล์ชื่อ "data.txt" โดยมีรูปแบบดังนี้
74 122 235 111 292 111 211 133 156 79
เราควรใช้ฟังก์ชัน scan() ในการอ่ านไฟล์นี้ ดังนี้
เรามักพบไฟล์ข้อมูลที่มีรูปแบบที่ แน่นอนบางอย่าง เช่น ไฟล์ของข้อมูลที่ เป็นตัวเลข, เป็นตารางของตัวเลข หรือ เป็นไฟล์ที่แยกตัวเลขแต่ละค่าด้วยเครื่องหมาย "," ซึ่ง R มีวิธีในการอ่านไฟล์แต่ละรูปแบบดังนี้
ถ้าข้อมูลชุดหนึ่งถูกเก็บไว้ในไฟล์ชื่อ "data.txt" โดยมีรูปแบบดังนี้
74 122 235 111 292 111 211 133 156 79
เราควรใช้ฟังก์ชัน scan() ในการอ่ านไฟล์นี้ ดังนี้
> data =
scan(file="data.txt")
Read 10 items
สำหรับฟังก์ชันจะมีตัวเลือก
(options) ที่ช่วยให้เราสามารถอ่านไฟล์ที่มีรูปแบบบางอย่างได้ เช่นไฟล์ที่ใช้ "," ในการแยกแต่ละค่าของข้อมูล, (sep=) สำหรับข้อมูลที่อยู่ในรูปของตารางสามารถอ่านได้ด้วยฟังก์ชัน
read.table() เช่น ในไฟล์
"data.txt" ประกอบด้วย ข้อมูลในรูปของตารางดังนี้
x y
74 55
122 64
235 78
111 54
292 120
111 100
211 175
133 80
156 200
79 80
74 55
122 64
235 78
111 54
292 120
111 100
211 175
133 80
156 200
79 80
>
read.table("data.txt", header=TRUE)
x y
1
74 55
2 122 64
3 235 78
4 111 54
5 292 120
6 111 100
7 211 175
8 133 80
9 156 200
10 79 80
argument header=TRUE หมายความว่าบรรทัดแรกของไฟล์คือชื่อของตัวแปรในแต่ละคอลัมน์2 122 64
3 235 78
4 111 54
5 292 120
6 111 100
7 211 175
8 133 80
9 156 200
10 79 80
1.4 การเขียนโปรแกรมใน R (Programming in R )
ข้อดีอย่างหนึ่งของ R เมื่อเปรียบเทียบกับโปรแกรมสำเร็จรูปทางสถิติอื่นๆ คือ R เป็นภาษาสำหรับการโปรแกรมซึ่ง มีไวยากรณ์(syntax) ที่แน่นอนและทันสมัย ทำให้เราสามารถเขียนฟังก์ชันที่ช่วยให้การทำงานของเราง่ายขึ้น และเรายังสามารถ ขยายฟังก์ชันของ R ที่มีอยู่แล้วให้เหมาะกับงานของเราได้อีกด้วย
1.4.1 การแก้ไขฟังก์ชัน (Editing Functions)
โดยปกติการเขียนโปรแกรมเป็นกระบวนที่ประกอบด้วยขั้นตอนต่างๆ และต้องมีการทำขั้นตอนเหล่านี้ซ้ำๆกันจนกว่าเราจะได้ผลที่น่าพอใจกระบวนการเหล่ านี้ได้แก่ การเขียนฟังก์ชัน การทดสอบฟังก์ชันที่เขียนขึ้นมา การหาความผิดพลาดในฟังก์ชัน การแก้ปัญหาที่เกิดขึ้น เพื่อให้การเขียนโปรแกรมง่ายขึ้นและทำให้เราสามารถให้ความสำคัญกับสิ่งที่สำคัญกว่าเราควรฝึกทักษะการเขียนโปรแกรมให้ดีก่อน สำหรับการเขียนฟังก์ชันใน R นั้นควรเขียนด้วยการใช้ text files ในโปรแกรม editor อื่นๆ เช่น Notepad เป็นต้น นอกจากนั้นเราสามารถใช้ฟังก์ชันedit() ในการควบคุมฟังก์ชันจาก command line ได้ด้วย
โดยปกติการเขียนโปรแกรมเป็นกระบวนที่ประกอบด้วยขั้นตอนต่างๆ และต้องมีการทำขั้นตอนเหล่านี้ซ้ำๆกันจนกว่าเราจะได้ผลที่น่าพอใจกระบวนการเหล่ านี้ได้แก่ การเขียนฟังก์ชัน การทดสอบฟังก์ชันที่เขียนขึ้นมา การหาความผิดพลาดในฟังก์ชัน การแก้ปัญหาที่เกิดขึ้น เพื่อให้การเขียนโปรแกรมง่ายขึ้นและทำให้เราสามารถให้ความสำคัญกับสิ่งที่สำคัญกว่าเราควรฝึกทักษะการเขียนโปรแกรมให้ดีก่อน สำหรับการเขียนฟังก์ชันใน R นั้นควรเขียนด้วยการใช้ text files ในโปรแกรม editor อื่นๆ เช่น Notepad เป็นต้น นอกจากนั้นเราสามารถใช้ฟังก์ชันedit() ในการควบคุมฟังก์ชันจาก command line ได้ด้วย
การใช edit()
เราจะแสดงวิธีใช้ฟังกชันedit() ด้วยตัวอย่างง่ายๆ คือฟังก์ชัน "hello world" โดยเริ่มจากการสร้าง ฟังก์ชัน บน command line ดังนี้
เราจะแสดงวิธีใช้ฟังกชันedit() ด้วยตัวอย่างง่ายๆ คือฟังก์ชัน "hello world" โดยเริ่มจากการสร้าง ฟังก์ชัน บน command line ดังนี้
> hello = function() {cat("hello world\n")}
> hello()
hello world
>
ฟังก์ชันนี้เป็นคำสั่งให้พิมพ์ข้อความ "hello world" บนหน้าจอโดยใช้ cat()
และ "\n" เป็นการสั่งให้พิมพ์โดยขึ้นบรรทัดใหม่ ถ้าเราต้องการที่จะแก้ไขฟังก์ชันนี้ทำได้โดยการใช้ฟังก์ชันedit() เพื่อใช้
editor ในการแก้ไข เราเรียก edit() ดังนี้
> hello =
edit(hello) " #assign
results of edit() back to hello
คำสั่งนี้จะเปิด text editor สำหรับฟังก์ชัน
"hello" ขึ้นมาเพื่อทำการแก้ไข หลังจากแก้ไขแล้วให้
save และ exit จาก editor
function()
{cat("hello world\n")}
แก้ไขใหม่ได้เป็น
hello=function(x)
{cat("hello",x,"\n")}
ฟังก์ชันที่แก้ไขใหม่นี้สามารถรับ argument ได้
เช่น
>
hello("kitty")
hello kitty 1.4.2 การใช้ฟังก์ชัน (Using Functions)
ฟังก์ชันใน R
ถูกกำหนดด้วยส่วนต่างๆดังนี้
function (arguments) bodyพิจารณาจากตัวอย่าง
cat("hello",x,"\n")
functionเป็น keyword
ที่ใช้โดยมี argument คือตัวแปรให้เป็น x และมี bodyคือคำสั่ง cat("hello",x,"\n")
อาร์กูเมนต์ของฟังก์ชัน(Function
Arguments)
เมื่อใช้ฟังก์ชันเรามักจะใส่
arguments ให้กับฟังก์ชันนั้นเพื่อให้ได้ผลลัพธ์ที่แตกต่างกันตาม argument ที่ใส่ไป การกำหนด argument ให้กับฟังก์ชันทำได้โดยการใช้ตัวแปรหนึ่งตัวแทนแต่ละ
argument และแยกแต่ละ argument โดยใช้
เครื่องหมาย
","
เช่น
arg1, arg2, arg3เมื่อกำหนดฟังก์ชันค่าโดยปริยาย(defualt) ของ argument สามารถกำหนดได้ดังนี้
arg1 = defualt1, arg2 = defualt2, arg3 = default3
อย่างไรก็ตามเราไม่จำเป็นต้องกำหนด default ก็ได้ แต่ถ้าเรากำหนด default ไว้ เมื่อเราเรียกฟังก์ชันนั้นโดยไม่ใส่ argument ฟังก์ชันนั้นจะใช้ค่า default ในการทำงาน
ตัวอย่างที่
1.2 การสร้างฟังก์ชัน histrogram ของเราเอง
เนื่องจากฟังก์ชัน hist()
ใน R ไม่ค่อยสมบูรณ์นัก โดยปกติฮิสโทแกรมเป็นการศึกษาถึงแนวโน้มของการแจกแจง
ของค่าสังเกต ดังนั้นหากเพิ่มเส้นโค้งความหนาแน่นในฮิสโทแกรมได้ก็จะเป็นประโยชน์มากขึ้น
เราจะเริ่มสร้างฟังก์ชัน สำหรับสร้างฮิสโทแกรมของเราเองดังนี้hist(x,breaks="Scott", probability=TRUE)
ในฟังก์ชันนี้เราใช้กฏของ
"Scott" ในการกำหนด bins
ลองใช้ฟังก์ชันนี้ดังนี้
> x =
rnorm(100)จะแสดงผลกราฟดังนี้
ปรากฏว่าฟังก์ชั่นนี้ทำงานได้ถูกต้อง อย่างไรก็ตามเราต้องการเปลี่ยนข้อกำหนดของ break=? สามารถทำได้โดย กำหนด breaks = argument ดังนี้
ourhist = function(x,breaks="Scott") {
hist(x,breaks=breaks, probability=TRUE)
เราสามารถเรียกฟังก์ชันนี้ได้ดังนี้
> ourhist(x) # use defualt bin rule
> ourhist(x,"Sturges") # use different bin rule
เราสามารถกำหนดสีให้กับกราฟได้โดยการแก้ไขฟังก์ชันได้ดังนี้
ourhist =
function(x,breaks="Scott",col="purple")
{ hist(x,breaks=breaks, col=col,probability=TRUE) lines(density(x))
สำหรับฟังก์ชันนี้สีของกราฟที่เป็น default คือสีม่วง
แต่เราสามารถเปลี่ยนสีของกราฟเป็นสีอะรก็ได้โดยการกำหนด argument ดังนี้
> ourhist(x,"Sturges","green") จะได้กราฟตามรูปที่ 1.2
Function Body
and Return Values
Function body เป็นกลุ่มของคำสั่งที่ผู้เขียนฟังก์ชันกำหนดให้ทำงาน
โดยการทำงานของคำสั่งเหล่านี้จะทำตามลำดับ
ของคำสั่ง (line by line)
การใช้ฟังก์ชันจะให้ผลลัพธ์ที่เกิดจากคำสั่งสุดท้ายในฟังก์ชัน
ซึ่งเราสามารถบังคับให้ฟังก์ชัน
แสดงผลลัพธ์นี้ได้โดยใช้ฟังก์ชันreturn() ถ้าไม่ต้องการให้แสดงผลลัพธ์สามารถใช้ฟังก์ชัน invisible() แทนได้ภายในกลุ่มคำสั่งเราสามารถใช้ฟังก์ชั่น print() หรือ cat()
เพื่อให้มีการแสดงผลออกทางหน้าจอได้ สำหรับใน Windows
GUI การพิมพผลลัพธ์อาจถูกกำหนดเป็น buffer เราสามารถใช้ฟังก์ชันflush.console()
ในการแสดงผลลัพธ์ต่างๆที่เป็น buffer ได้
ตัวอย่างที่ 1.3 EDA
function (return
values)ในการแสดงผลลัพธ์ต่างๆที่เป็น buffer ได้
old.par = par(no.readonly = TRUE) # See par examples
on.exit(par(old.par))
#
hist(x,breaks="Scott", probability=TRUE,col="purple")
lines(density(x))
#
boxplot(x,horizontal=TRUE) # boxplot with points
rug(x) # marked by rug()
#
return(summary(x)) # return summary
}
พิจารณา body ของฟังก์ชันeda()
จะว่ามีการเซตให้par() ให้เป็นold.par และใช้ฟังกชันon.exit()
ทำงานเมื่อสิ่นสุดกระบวนการของฟังก์ชันนี้
ซึ่งในกรณีนี้จะทำให้ par()
ถูกเซตกลับไปเป็นค่าเดิม
คำสั่งmfrow=c(1,3) ในฟังก์ชันนี้เป็นการกำหนดให้สร้างกราฟ 3
รูป บนสกรีนเดียวกัน และคำสั่งสุดท้ายในฟังกชันใช้return() ในการแสดงผลของคำสั่งsummary()
ฟังก์ชันประเภทนี้มีประโยชน์อย่างมาก อย่างไรก็ตามเราสามารถปรับปรุงฟังก์ชันนี้ให้สามารถใช้งานได้กว้างขวาง
ขึ้น เช่นฟังก์ชันนี้เขียนขึ้นเพื่อใช้กับข้อมู
ลตัวแปรเดียว และเป็นตัวแปรเชิงปริมาณเท่านั้น หากเรามีตัวแปรที่ ต้องการ
ศึกษามากกว่าหนึ่งตัวแปร หรือตัวแปรของเราเป็
นตัวแปรเชิงคุณภาพ
หรือตัวแปรเชิงกลุ่ม เราควรเขียนฟังก์ชันที่ สามารถใช้กับตัวแปรเหล่านี้ได้ด้วย
> eda(rnorm(100))
Min. 1st Qu. Median Mean 3rd Qu. Max.
-2.88500 -0.49370 0.21170 0.08201 0.70710 3.81500
การหาค่าเงื่อนไข Conditional Evaluation-2.88500 -0.49370 0.21170 0.08201 0.70710 3.81500
Rมีวิธีการจัดการกับกระบวนการแบบมีเงื่อนไขโดยการใช้ฟังก์ชัน
if() มีรูปแบบ 2
รูปแบบคือ
"if-then" form
if (condition) {
statement(s) if condition is TRUE
}
"if-then-else" form
if (condition) {
statement(s) if condition is TRUE
} else {
statement(s) if condition is FALSE
}
เงื่อนไขที่ ใช้ในฟังก์ชัน if() ต้องเป็น logical expression เช่น x > 0 หรือ x == y เป็นต้น
"if-then" form
if (condition) {
statement(s) if condition is TRUE
}
"if-then-else" form
if (condition) {
statement(s) if condition is TRUE
} else {
statement(s) if condition is FALSE
}
เงื่อนไขที่ ใช้ในฟังก์ชัน if() ต้องเป็น logical expression เช่น x > 0 หรือ x == y เป็นต้น
สมมุติว่าเราต้องการปรับปรุงฟังก์ชัน eda() ที่เราเขียนไว้ในตอนต้น โดยต้องการให้ฟังก์ชันรับทราบถึงชนิดของ ตัวแปร ,x เช่น ถ้า x เป็นปัจจัยหรือเป็นตัวแปรเชิงกลุ่ม ค่าสถิติที่ใช้ในการสรุปเกี่ยวกับตัวแปรนี้ก็จะแตกต่างจาก ข้อสรุปเมื่อ x เป็นตัวแปรเชิงปริมาณ วิธีง่ายๆที่สามารถทำได้คือการใช้เงื่อนไขในฟังก์ชัน เช่น
##
do factor summary
} else if (is.numeric(x)) {
## do numeric summary
} else {
## do a default summary
}} else if (is.numeric(x)) {
## do numeric summary
} else {
## do a default summary
การทำงานเป็นวงรอบ Looping
การใช้ loop ใน R ทำได้ 3 รูปแบบคือ for(),
while() และ repeat() สำหรับ repeat() ไม่ค่อยนิยมใช้จึง จะไม่กล่าวถึงในที่นี้
for()loops
โครงสร้างของการเขียน for() คือ
for (varname in seq) {
statement(s)
}
varname คือชื่อของตัวแปร seq เป็นได้ทั้ง vector หรือ list และ statements จะทำงานสำหรับแต่ละค่าของ seq ตัวอย่างง่ายๆในการใช้ for() loop คือโปรแกรมการนับถอยหลัง
> for (i in 10:1) print(i)
อีกตัวอย่างหนึ่ งคือโปรแกรมการหาค่าของ n! = n×(n−1) ×···×2 ×1
fact = function(x) {
ret = 1
for (i in 1:x) {for()loops
โครงสร้างของการเขียน for() คือ
for (varname in seq) {
statement(s)
}
varname คือชื่อของตัวแปร seq เป็นได้ทั้ง vector หรือ list และ statements จะทำงานสำหรับแต่ละค่าของ seq ตัวอย่างง่ายๆในการใช้ for() loop คือโปรแกรมการนับถอยหลัง
> for (i in 10:1) print(i)
อีกตัวอย่างหนึ่ งคือโปรแกรมการหาค่าของ n! = n×(n−1) ×···×2 ×1
fact = function(x) {
ret = 1
ret = ret*i
}
return(ret)
}
while() loops
return(ret)
}
การใช้ for() จะทำได้ก็ต่อเมื่อเราทราบจำนวนครั้งที่ต้องการทำซ้ำ
แต่ในบางครั้งเราไม่ทราบว่าต้องทำซ้ำเท่าไรจึง จะได้ผลลัพธ์ที่ต้องการ
ซึ่งวิธีที่ใช้คือเราจะทำซ้ำเมื่อเงื่อนไขที่กำหนดไว้ถูกต้อง
เมื่อไรก็ตามที่เงื่อนไขผิดไปโปรแกรม จะหยุกการทำซ้ำทันที ฟังก์ชัน while() สามารถทำงานที่เราต้องการนี้ได้
โดยมีโครงสร้างคือ
while (condition) {
statement(s)
}
ตัวอย่างต่อไปนี้เป็นโปรแกรมนับจำนวนเหรียญที่ ขึ้นก้อยไปจนกว่าจะได้เหรียญเป็นหัวเหรียญแรก
tosscoin = function() {
coin = "tails" # initialize condition
count = -1 # get counting reight this way
while(coin == "tails") {
coin
= sample(c("heads","tails"),1)}
ตัวอย่างต่อไปนี้เป็นโปรแกรมนับจำนวนเหรียญที่ ขึ้นก้อยไปจนกว่าจะได้เหรียญเป็นหัวเหรียญแรก
tosscoin = function() {
coin = "tails" # initialize condition
count = -1 # get counting reight this way
while(coin == "tails") {
}
cat("There were",count,"tails before the first heads\n")
}
บ่อยครั้งที่เราสามารถใช้ฟังก์ชัน while() และ for() แทนกันได้ เช่น เราต้องการเขียนโปรแกรมคำนวนค่า n! โดยใช้ while() สามารถทำได้ดังนี้
fact = function(x) {
ret = 1cat("There were",count,"tails before the first heads\n")
}
บ่อยครั้งที่เราสามารถใช้ฟังก์ชัน while() และ for() แทนกันได้ เช่น เราต้องการเขียนโปรแกรมคำนวนค่า n! โดยใช้ while() สามารถทำได้ดังนี้
fact = function(x) {
while(x > 0) {
ret = ret*x
x = x-1
}
return(ret)
}x = x-1
}
return(ret)
ทั้งสองโปรแกรมนี้ทำงานได้พอๆกัน
ไม่ได้ประหยัดเวลามากกว่ากัน
ไม่มีความคิดเห็น:
แสดงความคิดเห็น