นโยบายการจัดการความรู้ มหาวิทยาลัยสงขลานครินทร์ 1.ให้ใช้เครื่องมือการจัดการความรู้ผลักดัน คุณภาพคน และกระบวนทำงาน 2.ส่งเสริมการแลกเปลี่ยนประสบการณ์การทำงาน จากหน้างาน 3.ส่งเสริมให้มีเวทีเรียนรู้ร่วมกัน

Our Shangri-La
Ico64
Kittisakdi Choomalee

ภาควิชาเวชศาสตร์ชุมชน คณะแพทยศาสตร์ มหาวิทยาลัยสงขลานครินทร์
Network
Members · Following: 0 · Followed: 16

อ่าน: 1479
ความเห็น: 0

ก้าวย่าง ทางเดิน ลืมเลือนคืนวัน ดั้นด้นไป: KML vs R ยกที่ ๖

ก่อนเข้าเรื่อง คุยเฟื่องเรื่องหลากหลาย ชวนงงหงาย ตาลานลาย คล้ายเป็นลม

มาต่อกันด้วยเรื่องของโปรแกรม R ต่อนะครับกำลังจะจบบันทึกในซีรีย์นี้แล้วนะครับ (ฮา)

ครั้งที่แล้วเราทำความรู้จักกับรูปแบบการเก็บข้อมูลของโปรแกรม R ที่เป็นแบบ matrix กันไปแล้วนะครับ วันนี้เหลือรูปแบบการเก็บข้อมูล/ วัตถุในโปรแกรม R ที่เกี่ยวข้องกับเรื่องราวในบันทึกซีรีย์นี้อีกหนึ่งแบบ

แบบสุดท้ายที่จะพูดถึงก็คือ list

ความจริงแล้วผมพูดถึง list ไปบ้างแล้วเหมือนกัน วันนี้มาทวนกันอีกสักรอบนะครับว่า list คืออะไร

list เป็นวัตถุหรือรูปแบบการเก็บข้อมูลรูปแบบหนึ่งในโปรแกรม R โดยที่  list ประกอบไปด้วยวัตถุอื่นๆ อยู่ภายใน อาจจะเป็น list เอง matrix, vector หรืออื่นๆ

ข้อดีของ list คือ list สามารถที่จะบรรจุวัตถุต่างชนิดกันอยู่ภายใน list เดียวกันได้ วัตถุอื่นเช่น vector, matrix, array มีข้อจำกัดคือ ข้อมูลที่บรรจุอยู่ภายในวัตถุดังกล่าวต้องเป็นชนิดเดียวกันทั้งหมดเท่านั้น เช่น

ข้อมูลที่เป็น vector หากมีตัวเลขและตัวอักษรอยู่รวมกันใน vector เดียวกัน เวคเตอร์นั้นจะกลายเป็นเวคเตอร์ตัวอักษร (character) หากจะให้เป็นเวคเตอร์ตัวเลข เวคเตอร์นั้นๆ ต้องเป็นตัวเลขอย่างเดียวบรรจุอยู่เท่านั้น

ลองมาดูคำสั่งข้างล่างนะครับ

> x2 <- c("sri", "dang", "dum", "somchai", 5, 7)
> class(x2)
[1] "character"
> x2
[1] "sri"  "dang"   "dum"    "somchai"   "5"  "7"

  • กำหนดให้วัตถุ x2 ประกอบไปด้วยข้อมูล 6 ข้อมูลด้วยกันคือ sri, dang, dum, somchai, 5 และ 7
  • ตรวจสอบ class ของวัตถุ x2
  • โปรแกรม R ส่งค่ากลับมาว่าวัตถุ x2 มี class เป็นเวอคเตอร์ตัวอักษร (character vector)
  • แสดงค่าที่อยู่ภายในวัตถุ x2
  • โปรแกรม R ส่งค่าที่อยู่ภายในวัตถุ X2 ออกมาคือ [1] "sri" "dang" "dum" "somchai" "5" "7"  ส่วน [1] นั้นคือแถวที่ 1 นั่นเอง (ไม่มีเครื่องหมาย , หน้าหรือหลังตัวเลขภายใน [ ] แสดงว่าข้อมูลจัดเก็บอยู่ในมิติเดียวเรียงต่อกัน)

คราวนี้ลองมาดูคำสั่งอีกชุดนึงนะครับ

> a1 <- c(1:20)
> dim(a1) <- c(4,5)
> class (a1)
[1] "matrix"
> a1
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    5    9   13   17
[2,]    2    6   10   14   18
[3,]    3    7   11   15   19
[4,]    4    8   12   16   20

  • กำหนดให้วัตถุ a1 ประกอบไปได้วยค่า 1 ถึง 20
  • เปลี่ยนวัตถุ a1 (numeric vector) ให้เป็น matrix (มี 2 มิติ) โดยมีจำนวนแถวเป็น 4 แถวและจำนวนสดมภ์เป็น 5 สดมภ์ จัดเก็บข้อมูลที่เปลี่ยนเป็น matrix แล้วเก็บไว้ในวัตถุ a1 เช่นเดิม
  • ตรวจสอบ class ของวัตถุ a1
  • โปรแกรม R คืนค่ากลับมาว่าวัตถุ a1 เป็น matrix
  • แสดงค่าที่อยู่ภายในวัตถุ a1
  • โปรแกรม R ส่งค่าที่เก็บอยู่ในวัตถุ a1 ออกมา ประกอบไปด้วยข้อมูลที่มี 4 แถว 5 สดมภ์ โปรดสังเกตว่าภายในเครื่องหมาย [ ] ที่มีหมายเลขแถวอยู่ภายในจะมีเครื่องหมาย , ตามหลังหมายเลขประจำแถว และ มีเครื่องหมาย , อยู่หน้าหมายเลข (บอก) ประจำสดมภ์อยู่ภายในเครื่องหมาย [ ] ในส่วนของสดมภ์ ค่าที่ตำแหน่ง a1[3,3] คือ 11 นั่นเอง

ลองดูอีกคำสั่งนะครับเป็นคำสั่งในลักษณะเดียวกับคำสั่งข้างต้นเพียงแต่กำหนดให้ a2 ประกอบไปด้วยค่า 1 ถึง 12 และเปลี่ยนให้เป็น matrix ที่มีจำนวนแถวเป็น 2 แถวและสดมภ์เป็น 6 สดมภ์

> a2 <- c(1:12)
> dim(a2) <- c(2,6)
> class(a2)
[1] "matrix"
> a2
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1    3    5    7    9   11
[2,]    2    4    6    8   10   12

ทำการสร้างวัตถุ a12 โดยให้ค่าที่บรรจุในวัตถุ a12 เป็นค่าที่เกิดจากการนำเอาข้อมูลที่อยู่ในวัตถุ a1 และ a2 มาเรียงสดมภ์ต่อกัน (cbind())

> a12 <- cbind(a1,a2)
Error in cbind(a1, a2) :
  number of rows of matrices must match (see arg 2)

จะเห็นว่าโปรแกรม R ส่งค่าข้อความผิดพลาดแจ้งให้ทราบว่าจำนวนแถวของวัตถุ a1 และ a2 ไม่เท่ากัน (วัตถุ a1 มี 4 แถว วัตถุ a2 มี 2 แถว) ไม่สามารถนำวัตถุทั้ง 2 มารวมกันทางสดมภ์ได้

คราวนี้เราลองเปลี่ยนวิธีการรวมกันของวัตถุที่มี class เป็น matrix และมีจำนวนแถวและสดมภ์ไม่เท่ากันโดยเก็บไว้ในวัตถุทีี่มี class เป็น list

> a12 <- list(a1,a2)
> class(a12)
[1] "list"
> a12
[[1]]
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    5    9   13   17
[2,]    2    6   10   14   18
[3,]    3    7   11   15   19
[4,]    4    8   12   16   20

[[2]]
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1    3    5    7    9   11
[2,]    2    4    6    8   10   12

คำสั่งข้างต้นคือ

  • สร้างวัตถุ a12 โดยให้บรรจุค่าจากวัตถุ a1 และ a2 ซึ่งถูกเปลี่ยนจากวัตถุ class numeric vector ให้เป็นวัตถุ class list แล้ว (list(a1, a2))
  • ตรวจสอบ class ของวัตถุ a12
  • โปรแกรม R ส่งค่ากลับมาแจ้งว่าวัตถุ a12 มี class เป็น list
  • สั่งให้แสดงค่าที่เก็บในวัตถุ a12
  • โปรแกรม R ส่งค่าที่บรรจุในวัตถุ a12 มาให้ประกอบไปด้วยข้อมูลที่บรรจุในวัตถุ a1 และข้อมูลที่บรรจุอยู่ในวัตถุ a2 โดยข้อมูลที่บรรจุอยู่ในวัตถุ a1 จะเริ่มต้นด้วย [[1]] และข้อมูลในวัตถุ a2 เริ่มต้นด้วย [[2]] นั่นคือวัตถุ a12 ประกอบไปด้วยวัตถุ 2 วัตถุอยู่ภายใน โดยมีแถวที่ 1 (วัตถุที่ 1/ [[1]]) เป็นข้อมูลจากวัตถุ a1 ที่ถูกเปลี่ยน class ให้เป็น list และแถวที่ 2 (วัตถุที่ 2/ [[2]]) เป็นข้อมูลจากวัตถุ a2 ที่ถูกเปลี่ยน class ให้เป็น list 

เราสามารถตรวจสอบว่าวัตถุที่อยู่ภายในวัตถุ a12 วัตถุที่ 1 (แถวที่1) มี class เป็นอะไรด้วยคำสั่ง

> class(a12[1])
[1] "list"

หรือตรวจสอบว่าวัตถุที่ 2 (แถวที่2/ [[2]]) มี class เป็นอะไรด้วยคำสั่ง

> class(a12[2])
[1] "list"

เพื่อให้เข้าใจมากขึ้นลองดูคำสั่ง

> a12[1]
[[1]]
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    5    9   13   17
[2,]    2    6   10   14   18

คำสั่ง a12[1] คือการแสดงค่าที่เก็บในวัตถุ a12 ในแถวแรก (วัตถุแรก) นั่นเอง เมื่อตรวจสอบ class ที่ได้จากผลลัพธ์ของคำสั่งนี้โปรแกรม R จะส่งค่ากลับมาว่าเป็นข้อมูลชนิด list

เราลองมาดูคำสั่งเพิ่มเติมอีกนิดนะครับ

> a12 <- c(a1,a2)
> class(a12)
[1] "integer"
> a12
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20  1  2  3  4  5  6  7  8  9 10 11 12
> a11 <-c(a1)
> class(a11)
[1] "integer"
> a11
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20

  • คำสั่งข้างต้นเป็นคำสั่งที่ให้รวมค่าจากวัตถุ a1 และ a2 เข้าด้วยกันเก็บไว้ในวัตถุ a12 จำได้ใช่ไหมครับว่าวัตถุ a1 และ a2 นั้นมี class เป็น matrix ทั้งคู่ เราใช้คำสั่ง c() รวมข้อมูลจากวัตถุทั้ง 2
  • เมื่อตรวจสอบ class ของวัตถุ a12 ที่เกิดจากการรวมข้อมูลจากวัตถุ a1 และ a2 ด้วยคำสั่ง c() พบว่า class ของวัตถุ a12 เป็น interger vector หรือเป็นเวอคเตอร์จำนวนเต็ม
  • เมื่อสั่งให้แสดงค่าที่อยู่ภายในวัตถุ a12 พบว่าเป็นข้อมูลที่อยู่ในวัตถุ a1 และ a2 มาเรียงต่อกันเป็นชุดข้อมูล 1 ชุดหรือเรียงต่อกันในแนวนอน (แถวเดียว) นั่นคือเมื่อใช้คำสั่ง c() รวมวัตถุที่มี class เป็น matrix เข้าด้วยกัน ข้อมูลในวัตถุนั้นๆ จะถูกเปลี่ยนเป็น vector
  • ลองทดสอบด้วยการสร้างวัตถุ a11 ขึ้นมาโดยให้วัตถุ a11 ประกอบไปด้วยค่าจากวัตถุ a1 (ที่เป็น matrix) ด้วยการใช้คำสั่ง c(a1)
  • ตรวจสอบ class ของวัตถุ a11
  • โปรแกรม R ส่งค่ากลับมาว่า วัตถุ a11 มี class เป็น interger vector หรือเวคเตอร์จำนวนเต็ม
  • สั่งให้แสดงค่าที่เก็ยนวัตถุ a11
  • ค่าที่เก็บในวัตถุ a11 เป็นค่าที่เรียงต่อกันเป็นแถวเดียวตั้งแต่ 1 ถึง 20

เริ่มมึนกันแล้วยังครับ

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

กรอบข้อมูล เป็นวัตถุที่มีลักษณะคล้ายคลึงกับ matrix กรอบข้อมูลเป็นวัตถุพื้นฐานที่ใช้ในการคำนวณทางสถิติ กรอบข้อมูลเปรียบได้กับแฟ้มข้อมูลสำหรับการวิเคราะห์ข้อมูลของโปรแกรมวิเคราะห์ข้อมูลทางสถิติต่างๆ นั่นเอง

เช่นแฟ้มข้อมูลของโปรแกรม SPSS (.sav) แฟ้มข้อมูลของโปรแกรม stata (.dta) หรือแม้แต่แฟ้มข้อมูลที่เก็บแบบข้อความเรียบอย่าง csv

นั่นคือกรอบข้อมูลประกอบไปด้วยสดมภ์และแถวเหมือนกับ matrix เพียงแต่กรอบข้อมูลจะบรรจุไปด้วยเวคเตอร์ต่างๆ เช่น numeric vector, character vector หรือ interger vector

ลองดูคำสั่งต่อไปนี้ครับ

> a12.dat <- data.frame(a1,a2)
> class(a12.dat)
[1] "data.frame"
> a12.dat
  X1 X2 X3 X4 X5 X1.1 X2.1 X3.1 X4.1 X5.1 X6
1  1  5  9 13 17    1    3    5    7    9 11
2  2  6 10 14 18    2    4    6    8   10 12
3  3  7 11 15 19    1    3    5    7    9 11
4  4  8 12 16 20    2    4    6    8   10 12

ยังจำกันได้ใช่ไหมครับว่าวัตถุ a1 และวัตถุ a2 ในขณะนี้มี class เป็น list อยู่

  • เราสร้างกรอบข้อมูลที่ชื่อ a12.dat จากการรวมกันของข้อมูลภายในวัตถุ a1 และ a2 โดยใช้ฟังก์ชัน data.frame()
  • ตรวจสอบ class ของวัตถุ a12.dat
  • โปรแกรม R ตอบกลับมาว่าวัตถุ a12.dat มี class เป็น data frame
  • ให้แสดงค่าของวัตถุ a12.dat
  • เราจะเห็นว่าสดมภ์ X1 X2 X3 X4 และ X5 นั้น (Xn = ชื่อตัวแปร) เป็นข้อมูลที่บรรจุอยู่ในวัตถุ a1 คือตัวเลข 1 - 20 หรือมีจำนวน 5 สดมภ์ 4 แถว ส่วนสดมภ์ X1.1 X2.1 X3.1 X4.1 X5.1 และ X6 นั้นเป็นข้อมูลที่บรรจุอยู่ในวัตถุ a2 แต่วัตถุ a2 มีเพียง 2 แถว แต่มีสดมภ์ 6 สดมภ์ หรือตัวเลข 1 - 12 ดังนั้นโปรแกรม R ทำการเพิ่ม (ทำซ้ำ) แถวให้อีก 2 แถวโดยทำซ้ำข้อมูลเดิม เพื่อให้มีจำนวนแถวเท่ากัน (กับข้อมูลที่บรรจุในวัตถุ a1 ที่มีแถว 4 แถว)

ไว้พบกันใหม่คราวหน้านะครับ

เราเอง


หมวดหมู่บันทึก: บริการวิชาการ
คำสำคัญ (keywords): getKMLcoordinates R  r  R GIS  R maptools  ข้าวยำ  เฉาก๊วย
สัญญาอนุญาต: ซีซี: แสดงที่มา-ไม่ใช้เพื่อการค้า-อนุญาตแบบเดียวกัน Cc-by-nc-sa
สร้าง: 27 มีนาคม 2555 16:37 แก้ไข: 27 มีนาคม 2555 16:37 [ แจ้งไม่เหมาะสม ]
ดอกไม้
สมาชิกที่ให้กำลังใจ: Ico24 ServiceMan และ Ico24 คนธรรมดา.
สมาชิกที่ให้กำลังใจ
 
Facebook
Twitter
Google

บันทึกอื่นๆ

ความเห็น

ไม่มีความเห็น

ร่วมแสดงความเห็นในหน้านี้

ชื่อ:
อีเมล:
IP แอดเดรส: 3.92.92.168
ข้อความ:  
เรียกเครื่องมือจัดการข้อความ
   
ยกเลิก หรือ