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

Our Shangri-La
Ico64
Kittisakdi Choomalee

ภาควิชาเวชศาสตร์ชุมชน คณะแพทยศาสตร์ มหาวิทยาลัยสงขลานครินทร์
เครือข่าย
สมาชิก · ติดตาม: 0 · ผู้ติดตาม: 16

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

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

การทำวัตถุให้มี clas เป็น SpatialPointsDataFrame นั้นต้องให้วัตถุนั้นๆ มี class เป็น data frame เสียก่อน

มาถึงยกสุดท้ายจริงๆ แล้วครับสำหรับเรื่องชวนปวดหัวของ R

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

ข้อมูลที่ได้ประกอบไปด้วยข้อมูล ๖๙ แถว ๓ สดมภ์ แต่สดมภ์ที่ ๓ หรือ z coordinates นั้นมีค่าเป็น ๐ ทุกค่าหากไม่ต้องการเก็บข้อมูลนี้ไว้เราสามารถลบข้อมูลนี้ทิ้งไปได้ให้เหลือข้อมูลสดมภ์เฉพาะพิกัด x และ y เท่านั้น

หากเราสังเกตรูปที่เกิดจากการ plot() จะพบว่า รูปที่ได้จะไม่ใช่ลักษณะของแผนที่ แต่จะเป็นลักษณะของการ plot ค่า x และ y ธรรมดา เราจะเห็นว่าโปรแกรม R กำหนดขอบเขตตามข้อมูลที่มี รูปที่ได้จึงไม่สมส่วน พร้อมทั้งมีข้อมูลแกน x และ y ประกอบด้วย

หากข้อมูลที่ใช้ plot เป็นข้อมูล Spatial data หรือมี class เป็น "sp"  แล้วรูปที่ออกมาจะมีลักษณะอีกแบบหนึ่งและจะไม่มีการเขียนคำบรรยายของแกนต่างๆ ในรูป

จะเป็นลักษณะนี้ครับ

ดังนั้นขั้นตอนถัดไปจึงเป็นการทำให้ข้อมูลที่ได้ที่อยู่ในรูปของ matrix ให้อยู่ในรูปของ spatial data (SpatialPointsDataFrame) ที่เป็น SpatialPointsDataFrame เนื่องจากข้อมูลที่ได้เป็นข้อมูล point หรือจุดมานั่นเอง

เราอาจจะใช้เครื่องมืออย่างอื่นเช่น FWTools เพื่อแปลงข้อมูลจาก point ให้เป็น line ได้

การที่จะทำให้เป็น SpatialPointsDataFrame นั้นจะต้องทำให้วัตถุนั้นมีรูปแบบการเก็บข้อมูลเป็น data frame เสียก่อน

ผมลองให้ดูคำสั่งต่อไปนี้นะครับ

คงจำกันได้นะครับเมื่อครั้งที่แล้วข้อมูลที่เป็น coordinates x y z นั้นเก็บอยู่ในวัตถุที่ชื่อ test1.67.dim2 ซึ่งมี class เป็น matrix

ผมสร้างวัตถุใหม่ขึ้นมา ๑ วัตถุซึ่งมีทุกอย่างเหมือนวัตถุ test1.67.dim2 ให้ชื่อว่า test1.67.m2 แล้วลองเปลี่ยนวัตถุ test1.67.m2 นี้ให้เป็น SpatialPointsDataFrame โดยใช้ฟังก์ชัน coordinates()

> test1.67.m2 <- test1.67.dim2
> class(test1.67.m2)
[1] "matrix"
> test1.67.m2
           [,1]     [,2] [,3]
 [1,] 100.07497 15.23082    0
 [2,] 100.06355 15.22436    0
 [3,] 100.05911 15.21749    0
 --- ลบข้อมูลออกบางส่วน
[67,] 100.01962 13.37173    0
> coordinates(test1.67.m2) <- ~V1+V2
Error in function (classes, fdef, mtable)  :
  unable to find an inherited method for function "coordinates<-", for signature "matrix"

พบว่าไม่สามารถเปลี่ยนวัตถุที่มี class เป็น matrix ให้เป็น SpatialPointsDataFrame ได้ (unable to find an inherited method for function "coordinates<-", for signature "matrix")

ถ้าสังเกตก็จะเห็น class ของวัตถุ SpatialPointsDataFrame จะต่อท้ายด้วยคำว่า DataFrame ดังนั้นข้อมูลที่จะนำมาเปลี่ยนเป็น SpatialPointsDataFrame ก็น่าจะต้องมี class เป็น data frame ด้วย

ดังนั้นต้องทำการเปลี่ยนวัตถุ test1.67.dim2 ที่มี class เป็น matrix ให้มี class เป็น data frame เสียก่อน

ผมสร้างวัตถุชื่อ test1.67.dat จากวัตถุ test1.67.dim2 ให้มี class เป็น data frame โดยใช้ฟังก์ชัน data.frame() แล้วทำการเปลี่ยนวัตถุ test1.67.dat มี class เป็น SpatialPointsDataFrame ด้วยฟังก์ชัน coordinates()

> test1.67.dat <- data.frame(test1.67.dim2)
> class(test1.67.dat)
[1] "data.frame"
> test1.67.dat
          X1       X2 X3
1  100.07497 15.23082  0
2  100.06355 15.22436  0
3  100.05911 15.21749  0
--- ลบข้อมูลออกบางส่วน
67 100.01962 13.37173  0
> coordinates(test1.67.dat) <- ~X1+X2
> class(test1.67.dat)
[1] "SpatialPointsDataFrame"
attr(,"package")
[1] "sp"
> test1.67.dat
          coordinates X3
1  (100.075, 15.2308)  0
2  (100.064, 15.2244)  0
3  (100.059, 15.2175)  0
--- ลบข้อมูลออกบางส่วน
67  (100.02, 13.3717)  0

ให้สังเกตข้อมูลที่จัดเก็บอยู่ในวัตถุ test1.67.m2 วัตถุ test1.67.dat ก่อนที่จะถูกเปลี่ยนเป็น SpatialPointsDataFrame (มี class เป็น data frame) และข้อมูลที่เก็บในวัตถุ test1.67.dat ที่มี class เป็น SpatialPointsDataFrame แล้ว

ข้อมูลที่จัดเก็บในวัตถุ test1.67.dim2

           [,1]     [,2] [,3]
 [1,] 100.07497 15.23082    0
 [2,] 100.06355 15.22436    0
 [3,] 100.05911 15.21749    0

ข้อมูลที่จัดเก็บในวัตถุ test1.67.dat ที่มี class เป็น data frame

          X1       X2 X3
1  100.07497 15.23082  0
2  100.06355 15.22436  0
3  100.05911 15.21749  0

ข้อมูลที่จัดเก็บในวัตถุ test1.67.dat ที่มี class เป็น SpatialPointsDataFrame

          coordinates X3
1  (100.075, 15.2308)  0
2  (100.064, 15.2244)  0
3  (100.059, 15.2175)  0

ข้อมูลที่จัดเก็บในวัตถุ test1.67.dim2 ที่มี class เป็น matrix นั้นจะมีการระบุตำแหน่งในวัตถุด้วยเครื่องหมาย [ ] และเลขระบุตำแหน่งของสดมภ์และแถว ([1,] [,1])

ข้อมูลที่จัดเก็บในวัตถุ test1.67.dat ที่มี class เป็น data frame นั้นจะประกอบด้วยแถวและสดมภ์คล้ายๆ กับการเก็บข้อมูลในวัตถุ test1.67.dim2 ที่มี class เป็น matrix แต่จะมีชื่อสดมภ์ (name) เป็น X1 X2 และ X3 ตามลำดับ เมื่อแสดงผลจะแสดงหมายเลขแถวเท่านั้น ไม่มีเครื่องหมาย [ ] และหรือหมายเลขระบุตำแหน่งของแถวและสดมภ์

ส่วนข้อมูลที่จัดเก็บในวัตถุ test1.67.dat ที่มี class เป็น SpatialPointsDataFrame นั้นจะคล้ายกับวัตถุที่มี class เป็น data frame คือ มีแถวและสดมภ์ มีชื่อสดมภ์ ข้อมูลที่เป็น coordinates จะเป็นข้อมูลในสดมภ์เดียวกัน คือสดมภ์ที่ชื่อ coordinates ข้อมูลจะอยู่ภายในวงเล็บ () ส่วนสดมภ์ X3 นั้นเป็นข้อมูลทั่วไปที่ไม่ใช่ coordinates

ในการระบุว่า coordinates ประกอบไปด้วยสดมภ์ไหนบ้างนั้น เรากลับไปที่ฟังก์ชัน coordinates() กันนะครับ

coordinates(test1.67.dat) <- ~X1+X2

กำหนดให้ข้อมูลในวัตถุ test1.67.dat เป็น coordinates โดยที่ coordinates เป็นฟังก์ชันของ X1+X2 (เครื่องหมาย ~ หมายถึงเป็นฟังก์ชัน(ให้มีค่าเป็น))

X1 และ X2 เป็นชื่อสดมภ์ของวัตถุ test1.67.dat

เมื่อเราสั่ง plot ข้อมูลในวัตถุ test1.67.dat ที่มี class เป็น SpatialPointsDataFrame แล้วนั้นเราก็จะได้ภาพดังรูปข้างต้นครับ

เราเอง

หมวดหมู่บันทึก: บริการวิชาการ
สัญญาอนุญาต: ซีซี: แสดงที่มา-ไม่ใช้เพื่อการค้า-อนุญาตแบบเดียวกัน Cc-by-nc-sa
สร้าง: 02 เมษายน 2555 17:24 แก้ไข: 02 เมษายน 2555 17:24 [ แจ้งไม่เหมาะสม ]
ดอกไม้
สมาชิกที่ให้กำลังใจ: Ico24 DaDa, Ico24 ServiceMan, และ 2 คนอื่น.
สมาชิกที่ให้กำลังใจ
 
Facebook
Twitter
Google

บันทึกอื่นๆ

ความเห็น

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

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

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