Friday, December 24, 2010

R Programing

ชนิดของข้อมูลในแบบของ R

อภิชาต ศุรธณี และ กิติพร พลายมาศ


สวัสดีท่านผู้อ่านทุกท่านครับ หลังจากในตอนที่แล้วเราได้ทดลองทำการติดตั้ง R กันเรียบร้อยแล้ว ต่อจากนี้เรามาเริ่มทำความรู้จักกับฟังก์ชันที่สำคัญอีกอันหนึ่ง นั่นก็คือ help() จากนั้นผมจะแนะนำให้ทุกๆ ท่านรู้จักกับชนิดของข้อมูล (data types) ของ R กันครับ โดยในการอธิบายให้ทุกๆท่านเข้าใจได้โดยง่าย ผมขออธิบายด้วยการใช้ตัวอย่าง ซึ่งจะทำให้ได้เห็นการใช้งานและคำอธิบายไปพร้อมๆ กันครับ ในบทความตอนนี้อาจจะดูยุ่งยากและกล่าวลงไปในรายละเอียดอยู่บ้างสักหน่อย แต่ถือว่าเป็นส่วนเริ่มต้นที่สำคัญในการจัดการข้อมูลที่เราจะวิเคราะห์กันใน R กันเลยครับ


ในตอนที่แล้ว เราได้ทดลองใช้เครื่องหมาย “=” กันไปบ้างแล้วเล็กน้อย ซึ่งเครื่องหมายนี้ถูกใช้เพื่อกำหนดค่าจากทางขวาของเครื่องหมายเข้าสู่ตัวแปรทางด้านซ้ายของเครื่องหมาย เช่น


>A = 10


นอกจากนี้เรายังสามารถใช้เครื่องหมาย “<-” เพื่อกำหนดค่าเข้าสู่ตัวแปรได้เช่นกัน ซึ่งจะให้ผลลัพธ์เท่ากันกับการใช้เครื่องหมายเท่ากับ “=”


>A <- 10


เมื่อมีปัญหาเรียกใช้คำสั่ง Help!


ก่อนอื่นอยากให้ท่านผู้อ่านรู้จักกับคำสั่งนี้ก่อนครับ คำสั่ง help() เพราะหากเรามีปัญหาสำหรับรูปแบบการเรียกฟังก์ชันเมื่อใด เราจะเรียกคำสั่ง help() นี้เพื่อช่วยอธิบายรูปแบบการใช้งานของคำสั่ง ยกตัวอย่างเช่น เราต้องการทราบ input parameters สำหรับคำสั่ง “write” ซึ่งคำสั่งนี้จะใช้สำหรับการเขียนข้อมูลลงไฟล์ เราสามารถเรียกใช้ดูรูปแบบการใช้งานได้ด้วยคำสั่ง

>help(write)

หรือเราจะพิมพ์ว่า help(“write”) ก็ได้ครับ


สำหรับผลลัพธ์ที่แสดงออกมาหลังจากเรียกคำสั่งนี้แบ่งออกเป็นส่วนๆ ดังต่อไปนี้


Description -- แสดงรายละเอียดเกี่ยวกับตัวฟังก์ชันที่เราค้นหา

Usage -- แสดงรูปแบบการใช้งานการใส่ input parameters

Arguments -- ในส่วนนี้จะอธิบายว่าแต่ละ input parameters ควรเป็นอะไร

References -- แสดงแหล่งอ้างอิงสำหรับฟังก์ชันนี้

See also -- แสดงคำสั่งที่เกี่ยวข้องกับคำสั่งที่เรากำลังค้นหา

Examples -- แสดงตัวอย่างการใช้งานสำหรับฟังก์ชันที่เรากำลังค้นหา

นอกจากเราจะค้นหาโดยใช้คำสั่ง help() แล้ว เรายังสามารถค้นหาด้วยการใช้เพียงเครื่องหมาย “?” เช่น

>?write

ซึ่งจะให้ผลลัพธ์เช่นเดียวกัน ส่วนรายละเอียดของคำสั่ง write จะถูกกล่าวในเนื้อหาส่วนที่เกี่ยวข้องกับการเขียนไฟล์นะครับ อดใจรอกันสักหน่อยนะครับ


หมายเหตุ หากเราใช้งาน R บนระบบปฏิบัติการ Windows หรือบางระบบปฎิบัติการ ตัวเอกสารที่เราเรียกจากฟังก์ชัน help() จะถูกปรากฎอยู่ในหน้าต่างใหม่ของ R หรืออาจถูกเปิดบนหน้าต่าง web browser ได้ครับ เราสามารถปิดหน้าต่างเหล่านี้ได้โดยสะดวก แต่หากเราใช้งาน R บนหน้า console ของบางระบบปฏิบัติการ เช่น Linux ตัวเอกสารที่ถูกแสดงจากฟังก์ชัน help จะปรากฎเป็นรูปแบบของ text description ใน console นั้นๆ เราสามารถกดปุ่ม space หรือกดปุ่มลูกศรขึ้นลงเพิ่ออ่านข้อความทั้งหมดได้ และหลังจากเราอ่านข้อความอธิบายเรียบร้อยแล้ว เราสามารถออกจากหน้าเอกสารนี้ได้ด้วยการกดพิมพ์ตัวอักษร “q” ครับ


ในบางครั้งเราไม่ทราบชื่อที่แน่นอนของฟังก์ชันหรือแพกเก็ตที่เราต้องการใช้งาน เราสามารถใช้ฟังก์ชัน help.search() เพื่อค้นหาคำสั่งหรือแพ็กเกตที่เกี่ยวข้องกับ keyword ที่เราต้องการสืบค้นใน R ได้ด้วยรูปแบบ help.search(“คำที่เราต้องการจะค้นหา”) หรือแบบย่อๆ ง่ายๆ ก็คือ ใช้สัญลักษณ์ “??” แล้วตามด้วย keyword ได้เลยครับ

ยกตัวอย่างเช่น หากเราสนใจฟังก์ชันที่เกี่ยวข้องกับ distribution function ทางสถิติ เราสามารถค้นหาได้ด้วย keyword “distribution” ดังนี้


>help.search(“distribution”)


จากนั้นผลลัพธ์ที่ได้จะถูกแสดงเป็นลิสต์ของ “package name::title” เช่น stats::Binomial ซึ่งเราสามารถเรียกดูรายละเอียดแต่ละหัวข้อได้ด้วยคำสั่ง help หรือ ? นั่นเองครับ


>?stats::Binomial


หรือ

>?Binomial


หมายเหตุ ในกรณีที่มีมากกว่าหนึ่ง package ที่ใช้ชื่อ title ซ้ำกัน ตัวโปรแกรม R ก็จะขึ้น list ให้เราเลือกว่าจะเลือกดูรายละเอียดของ title นี้ใน package ใด


กล่าวโดยสรุปแล้ว help() หรือ ? เป็นการแสดงรายละเอียดการใช้งานฟังก์ชันหรือแพ็กเก็ตต่างๆ ที่เรารู้ชื่อฟังก์ชันแล้วแต่ไม่แน่ใจว่าจะต้องใช้งานอย่างไร แต่ help.search() หรือ ?? เป็นการสืบค้นเอกสารต่างๆ ใน R ที่ เกี่ยวข้องกับคำที่ต้องการค้นหาครับ ไม่จำเป็นต้องรู้ชื่อฟังก์ชันหรือชื่อแพกเก็ตที่แน่นอนครับ


ชนิดของข้อมูล (data types)


ใน R language มีชนิดของข้อมูลพื้นฐานหลักๆอยู่ด้วยกัน 4 ประเภท ได้แก่ numeric, integer, logical, และ character ครับ


ข้อมูลประเภทตัวเลข หรือ numeric


ข้อมูลประเภทตัวเลขหรือ numeric นั้นเป็นชนิดข้อมูลโดยปริยายสำหรับข้อมูลแบบตัวเลขครับ ที่กล่าวแบบนี้เพราะ ข้อมูลแบบตัวเลขมี 2 แบบครับคือ numeric กับ integer (ผมจะกล่าวถึง integer ในตอนหลังนะครับ) นั่นหมายถึงว่าหากเรากำหนดค่าตัวเลขใดๆ ทั้งแบบจำนวนเต็มหรือมีทศนิยม ให้กับตัวแปรใน R แล้ว ตัวแปรนั้นเป็นตัวแปรแบบ numeric ครับ เช่นหากเราใส่ค่าตัวเลขทศนิยม 1.5 ให้กับตัวแปร x

> x = 1.5

จากนั้นใช้คำสั่ง class เพื่อดูชนิดของข้อมูล จะพบว่า x เป็นตัวแปรที่เก็บค่าแบบ numeric ไว้ หรือเรียกว่าเป็น ตัวแปรแบบ numeric ครับ


> class(x)

[1] "numeric"


เช่นกันหากให้ค่าจำนวนเต็มกับตัวแปร เช่น กำหนดค่า 1 ให้กับตัวแปร x


> x = 1

> class(x)

[1] "numeric"


x ก็ยังคงเป็นตัวแปรชนิด numeric ถึงแม้ว่า 1 จะเป็นค่าจำนวนเต็ม (integer) ก็ตาม


ข้อมูลประเภทจำนวนเต็ม หรือ integer


ในการกำหนดค่าจำนวนเต็มให้กับตัวแปรใดๆและเราต้องการให้ตัวแปรนั้นเป็นแบบ integer เราสามารถใช้ฟังก์ชัน as.integer() สำหรับการแปลงค่า ตัวเลข หรือแม้แต่ string ของตัวเลข ให้เป็นค่าจำนวนเต็มได้ ยกตัวอย่างเช่น


> x = as.integer(1)

> class(x)

[1] "integer"

> x

[1] 1


พบว่าตัวแปร x เป็นตัวแปรแบบ integer ที่เก็บค่าจำนวนเต็มที่มีค่าเท่ากับ 1 ครับ และหากเราลองให้ค่าตัวเลขทศนิยม เช่น 1.5 ให้กับตัวแปรโดยผ่านทางฟังก์ชัน as.integer() มาดูกันสิครับว่าผลจะเป็นอย่างไร


> x = as.integer(1.5)

> class(x)

[1] "integer"

> x

[1] 1


ผลลัพธ์ที่ได้คือ x เป็นตัวแปรแบบ integer และก็ยังคงได้ค่าจำนวนเต็มที่มีค่าเท่ากับ 1 นั่นเอง จะสังเกตง่ายๆ ว่าฟังก์ชันจะตัดค่าตัวเลขหลังทศนิยมออกไปครับ


ที่นี้ เรามาลองกันเล่นๆ ดูครับว่า หากเรากำหนดค่าตัวเลขใส่ภายใต้เครื่องหมาย “” ซึ่งปกติหมายความว่าให้เป็นข้อความ หรือ string ที่เรียกว่า decimal string หรือข้อความที่เป็นตัวเลขทศนิยม เช่น

> x = as.integer("5.5")

> class(x)

[1] "integer"

> x

[1] 5


เราจะพบว่าค่า decimal string ที่ใส่เข้าไปให้กับฟังก์ชัน as.integer() จะถูกเปลี่ยนเป็นจำนวนเต็ม และถูกเก็บเข้าไปยังตัวแปร x ในที่นี่มีค่าเท่ากับ 5 ครับ ดังนั้นไม่ว่าเราจะเก็บค่า 5.8 หรือ 5.1 โดยผ่านฟังก์ชัน as.integer() ค่าที่เก็บเข้าไปก็จะเป็นเพียงค่า 5 เท่านั้น ลองเล่นกันดูได้นะครับ


ข้อควรระวังก็คือ หากเราเผลอแปลงค่า string ที่ไม่ใช่ string ของตัวเลข เช่น เราใส่ค่า string ของตัวอักษร เช่น “abc” ลองดูสิครับว่า ผลที่ได้จะออกมาเป็นอย่างไร

> x = as.integer("abc")

Warning message:

NAs introduced by coercion

> x

[1] NA


R จะส่งข้อความเตือน (warning message) ขึ้นมาว่า ค่า NAs ถูกแนะนำให้กับตัวแปรโดยการบังคับ เพราะเราได้ใส่ค่า non-decimal string หรือข้อความที่ไม่ใช่ตัวเลขทศนิยม เข้าไป ทำให้ไม่สามารถแปลงเป็นค่าจำนวนเต็มใดๆ ให้ได้ ในที่นี้ ค่า NA หมายถึง Not Available หรือ Missing values นั่นเองครับ


นอกจากฟังก์ชัน as.integer() จะใช้ช่วยแปลงข้อมูลประเภทต่างๆ ไปเป็นข้อมูลประเภท integer แล้ว ในลักษณะรูปแบบเดียวกัน ฟังก์ชัน as.numeric(), as.logical() และ as.character() ก็สามารถใช้แปลงประเภทข้อมูลได้เช่นกันครับ ลองเล่นดูนะครับ ผมจะยกตัวอย่างให้ดูบ้างในหัวข้อถัดไปครับ


ข้อมูลประเภทตรรกะ หรือ logical


ค่าข้อมูลแบบตรรกะมีค่าเป็นไปได้ 2 ค่าเท่านั้นครับคือ ‘จริง’ หรือ ‘เท็จ’ โดยใน R ค่าจริงจะแทนด้วย TRUE และค่าเท็จจะแทนด้วย FALSE เราสามารถกำหนดค่าตรรกะให้กับตัวแปรได้เลยครับ เช่น


> x = TRUE

> x

[1] TRUE

> class(x)

[1] "logical"


โดยทั่วไปการเก็บข้อมูลตรรกะใช้เพื่อเก็บผลที่ได้จากการเปรียบเทียบสองตัวแปร ว่ามากกว่า น้อยกว่า หรือมีค่าเท่ากันหรือไม่ ยกตัวอย่างเช่น


> x = 10; y = 5

> z = x > y

> z

[1] TRUE

> class(z)

[1] "logical"


หมายเหตุ เราสามารถใช้สัญลักษณ์ ; เพื่อทำการแยกหลายๆ คำสั่งที่อยู่บนบรรทัดเดียวกันครับ หรือสามารถใช้เก็บค่าตรรกะมาตรฐานเกี่ยวกับ and (&), or (|) หรือ negation (!)


> x = TRUE; y = FALSE

> z = x & y

> z

[1] FALSE

> class(z)

[1] "logical"


โดยตรรกะ and นั่นคือ จริง และ เท็จ จะเป็นเท็จนะครับ ซึ่งเราก็ได้ค่าเท็จหรือ FALSE ในตัวแปร z


> z = x | y

> z

[1] TRUE


เช่นกัน โดยตรรกะ or นั่นคือ จริง หรือ เท็จ จะได้ค่าจริง ซึ่งเราก็ได้ค่าจริง หรือ TRUE ในตัวแปร z ครับ


> z = !x

> z

[1] FALSE


และอีกเช่นกัน นิเสธ หรือ negation ของ ค่าจริงใน x ก็จะได้ค่าเท็จ ครับ


ข้อมูลประเภทตัวอักษร หรือ character


ในการเก็บข้อมูลชนิดตัวอักษรหรือ character นั้น เราสามารถทำได้ด้วยการใช้เครื่องหมาย “” เช่น


> x = "4.5"

> x

[1] "4.5"

> class(x)

[1] "character"


หรือเราสามารถกำหนดค่าตัวอักษรด้วยการใช้ฟังก์ชัน as.character() เช่น


> x = as.character(4.5)

> x

[1] "4.5"

> class(x)

[1] "character"


ค่าที่เก็บเข้าไปเป็นตัวอักษรนี้ไม่สามารถนำไปคำนวณได้ เช่นว่าหากเราต้องการบวกค่า 1 เข้ากับตัวแปร x เราจะได้ข้อความ error เพราะ R พบว่า x ไม่ใช่ตัวแปรที่เป็นตัวเลขที่ซึ่งสามารถใช้คำนวณค่าได้ ดังนี้


> x+1

Error in x + 1 : non-numeric argument to binary operator


ดังนั้นหากเราต้องการคำนวณค่านี้จริงๆ เราจำเป็นต้องแปลงให้ค่าในตัวแปร x เป็น ตัวเลข หรือจำนวนเต็มก่อน ด้วยฟังก์ชัน as.numeric() หรือ as.integer() ตามลำดับเช่น


> z = as.numeric(x)+1

> z

[1] 5.5

> class(z)

[1] "numeric"


สรุปเนื้อหาในบทความตอนนี้ เราได้เริ่มทำความรู้จักกับฟังก์ชัน help() และ help.search() ได้รู้จักกับชนิดของข้อมูล (data type) ต่างๆทั้ง numeric, integer, logical และ character และรวมถึงการแปลงชนิดของข้อมูลจากแบบหนึ่งไปเป็นอีกแบบหนึ่งด้วยฟังก์ชัน as.integer(), as.numeric(), as.logical() และ as.character() ครับ ดังนั้น ผมมีคำถามทิ้งท้ายบทความไว้นิดนึงครับว่า "เราจะรู้ค่าจำนวนเต็มของค่าตรรกะ TRUE และ FALSE ใน R ได้อย่างไร และมีค่าเป็นเท่าไรครับ" ในตอนหน้าเราจะกล่าวถึงการใช้ฟังก์ชันหรือคำสั่งที่เกี่ยวข้องกับการสร้าง เวกเตอร์ (vector) เมตริกซ์ (matrix) รวมถึง แฟกเตอร์ (factor) และ ลิสต์ (list) กันต่อไปครับ


แหล่งอ้างอิงเพิ่มเติม


[1] David Hiebeler, MATLAB/R Reference, http://www.math.umaine.edu/~hiebeler, 2010

[2] Peter Dalgaard, Introductory Statistics with R, Springer-Verlag new York, 2002.

[3] Kelly Black, R Tutorial, http://www.cyclismo.org/tutorial/R/index.html

[4] Chi Yau, R Tutorials, http://www.r-tutor.com/

No comments:

Post a Comment