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

Our Shangri-La
Ico64
Kittisakdi Choomalee

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

อ่าน: 961
ความเห็น: 2

ก้าวย่างทางเดิน ลืมเลือนคืนวัน ดั้นด้นไป: เดินไปเดินมา ๓ วัน กับ R # ๑๒ [C]

เงื่อนไขที่ทำให้ต้องเดินไปเดินมา

บันทึกที่เกี่ยวข้อง

 

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

 

ความเดิมตอนที่แล้ว

ตอนที่แล้วเราหยุดอยู่ที่คำถามว่าแล้วเราจะดึงค่า factor จากผลลัพธ์ที่ได้จากการแทนค่าแถวที่และสดมภ์ที่จากข้อมูลของผู้ป่วยแต่ละคน ที่อยู่ในแถวเดียวกันออกมาได้อย่างไร หลังจากที่เราทำให้ค่า factor ที่เราต้องการจากเดิมอยู่ในแนวเส้นทแยงมุม จากบนซ้ายมาล่างขวาของ matrix ผลลัพธ์จากการแทนค่าด้วยข้อมูลผู่ป่วยแต่ละคน

 

ความต่อ

 

เป็นคำถามมีคำตอบอยู่แล้ว และคาดว่าท่านผู้อ่านที่รักหลายคน คงคิดออกแล้ว เพราะคำตอบก็ไม่ได้อยู่ไกลลิบลับก็วน ๆ อยู่ในบันทึกนั่นเอง

แต่ที่ตั้งคำถามก็เพื่อให้ท่านผู้อ่านที่รักทุกท่านถามตัวเองว่า อ่านไปอ่านมามีที่อ่านแล้วไม่งง เข้าใจบ้างหรือเปล่าครับ

 

อิอิอิ

 

จากความรู้เดิมที่ผ่าน ๆ มาหากเราต้องการค่าใดใน matrix ก็ให้เราระบุตำแหน่งใน matrix ของค่านั้น ๆ

 

เช่น ข้อมูล factor ในตารางความสัมพันธ์ระหว่างค่า TG กับค่า Non HDL ที่เก็บอยู่ใน matrix tgnhdl นั้น หากเราต้องการดึงค่าใดที่อยู่ใน matrix นี้มาก็ให้เราระบุตำแหน่งใน matrix ของค่าที่เราต้องการเช่น เราต้องการดูค่าทีี่อยู่ในตำแหน่งแถวที่ ๓ สดมภ์ที่ ๔ เราก็จะใช้บรรทัดคำสั่ง

 

> tgnhdl[3,4]
[1] 23.3

 

ดังนั้นหากเราต้องการข้อมูลใน matrix ในแถวที่ ๑ ทั้งหมด ก็ให้เราระบุตำแหน่งแถวที่ต้องการส่วนสดมภ์ไม่ต้องระบุ

 

บรรทัดคำสั่ง

> tgnhdl[1,]
100-149 150-199 200-249 250-299 300-349 350-399
    4.6     8.1     3.8     7.7     7.5     8.1

 

ดังนั้นหากเราต้องการดึงค่า factor ที่อยู่ในแถวที่ ๑ ของผลลัพธ์จากการแทนค่าแถวและสดมภ์จากข้อมูลผู้ป่วยแต่ละคนก็จะได้เป็น

> matrix(tgnhdl[lipiddata2$tgrow, lipiddata2$nhdlcol],nrow=6, ncol=5)[1,]
[1]  4.4 12.4 12.9 11.6  1.7
Warning message:
In matrix(tgnhdl[lipiddata2$tgrow, lipiddata2$nhdlcol], nrow = 6,  :
  data length [25] is not a sub-multiple or multiple of the number of rows [6]

 

แต่วิธีการดังบรรทัดคำสั่งข้างต้นจะมี Warning message ออกมาด้วย

 

ยังจำได้ใช่ไหมครับว่า Warning message นี้จะเตือนเราว่า ใน matrix ของผลลัพธ์ที่ได้จะมีค่าซ้ำหรือเนื่องจากขนาดของ matrix มีจำนวนตำแหน่งของข้อมูลมากกว่าข้อมูลที่จะนำไปแทนค่าในตำแหน่งของ matrix ดังนั้นจะมีการวนใช้ค่าเดิมมาแทนค่าในตำแหน่งที่เหลือของ matrix จนเต็ม matrix

แต่หากเราไม่ต้องการให้แสดงข้อความ Warning message (ชั่วคราวเฉพาะบรรทัดคำสั่งที่ต้องการ) ให้เราใช้ฟังก์ชัน suppressWarnings() ครอบบรรทัดคำสั่งข้างต้นไว้อีกชั้นหนึ่ง

 

> suppressWarnings(matrix(tgnhdl[lipiddata2$tgrow, lipiddata2$nhdlcol],nrow=6, ncol=5)[1,])
[1]  4.4 12.4 12.9 11.6  1.7

 

ข้อความเตือน Warning message นี้มีประโยชน์สำหรับเรามากนะครับ เพราะจะแจ้งข้อผิดพลาด หรือข้อควรระวังให้เราทราบเมื่อสิ่งที่เราทำ (ใช้ฟังก์ชัน) นั้นอาจจะทำไม่ได้เพราะผิดข้อกำหนดหรือทำได้แต่ให้ระวังในบางจุด

 

คราวนี้เรามาใช้ข้อมูล (ตัวอย่าง) ของผู้ป่วยทั้ง ๑๐๐ คนในกรอบข้อมูล lipiddata กันนะครับ

 

ยังจำได้ใช่ไหมครับว่าข้อมูล (ตัวอย่าง) ของผู้ป่วยในกรอบข้อมูล lipiddata นั้นมีจำนวนทั้งหมด ๑๐๐ ข้อมูล ดังนั้นจำนวนแถวและสดมภ์ของ matrix ต้องเป็น ๑๐๑ และ ๑๐๐ ตามลำดับ

 

> suppressWarnings(matrix(tgnhdl[lipiddata$tgrow, lipiddata$nhdlcol],nrow=101, ncol=100)[1,])
  [1] 11.3 17.3  4.9 10.2  2.6 14.8  2.4  2.9 22.8  2.9  3.5  2.4  9.1  1.7 11.4 15.2 13.2  9.6  7.0  2.0 12.4  8.5 15.7  3.8  3.2  4.2  2.6  5.3  8.1 12.9 15.7
 [32]  2.2  3.2 12.5  3.5  9.4 26.3  2.6 11.5  1.2  8.5 13.5  4.4  4.4  4.7  9.2  4.4  8.7  2.4  2.2 22.8  8.1  8.3 11.3 11.0  3.5  3.3 22.8  2.1  9.6 14.3 24.5
 [63]  8.7  2.2  1.3  2.7 13.2 13.6  7.7  6.6  4.7  4.2 10.1 14.0  4.6  2.9 20.4 11.6 16.7  7.5  9.5 11.4  2.4 21.8  4.0 11.6  7.2  9.1  1.2  1.8 13.6 10.0  4.4
 [94]  2.9 23.0 11.0  9.4  4.0  3.8 12.9

 

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

 

บรรทัดคำสั่ง

 

> lipiddata$denofactor <- suppressWarnings(matrix(tgnhdl[lipiddata$tgrow, lipiddata$nhdlcol],nrow=101, ncol=100)[1,])
> head(lipiddata, n=10)
    tg nhdl tgrow nhdlcol denofactor
1  612  321    17       5       11.3
2  414  398    10       6       17.3
3  220  115     4       1        4.9
4  312  364     7       6       10.2
5  771  226    22       3        2.6
6  538  240    14       3       14.8
7  519  337    13       5        2.4
8  282  293     6       4        2.9
9  504  277    13       4       22.8
10 299  268     6       4        2.9

 

หรือเราไม่จำเป็นต้องใส่ฟังก์ชัน suppressWarnings() ก็ได้ เพียงแต่จะมีข้อความเตือน Warning message แสดงออกมาที่ Rconsole แต่ไม่มีผลกับข้อมูลในตัวแปร denofactor ในกรอบข้อมูล lipiddata ที่เราจะจัดเก็บ

 

 บรรทัดคำสั่ง

> lipiddata$denofactor <- matrix(tgnhdl[lipiddata$tgrow, lipiddata$nhdlcol],nrow=101, ncol=100)[1,]
Warning message:
In matrix(tgnhdl[lipiddata$tgrow, lipiddata$nhdlcol], nrow = 101,  :
  data length [10000] is not a sub-multiple or multiple of the number of rows [101]

 

วิธีการที่เราทำในการดึงข้อมูลค่า factor มาจากตาราง tgnhdl ดังตัวอย่างข้างต้นนี้อาจจะมีข้อจำกัดในกรณีของข้อมูลขนาดใหญ่ หรือมีข้อมูลจำนวนมาก เช่นจำนวนข้อมูลหลักแสน หลักล้าน ซึ่งอาจจะไปถึงจุดจำกัดของ R ในการรองรับจำนวนข้อมูลก็ได้ เนื่องจากวิธีการนี้จำเป็นที่จะต้องให้ R  สร้าง matrix ที่มีขนาดเป็น (n+1) x n เมื่อ n คือจำนวนระเบียน (records) ของข้อมูล

 

matrix ขนาด (n+1) x n อาจจะใหญ่เกินขอบจำกัดของ R ก็ได้ แต่หากใช้กับข้อมูลจำนวนไม่มาก วิธีการนี้ก็ยังคงใช้งานได้อยู่และการประมวลผลก็ไม่ช้ามาก

 

ข้อเด่นของ R อีกอย่างที่อาจจะเหนือกว่าโปรแกรมอื่น ๆ บางโปรแกรมคือ การทำงานของ R จะใช้การทำงานแบบ matrix

 

ผมลองทดสอบสร้าง matrix ขนาด ๑ ล้าน x ๑ ล้าน ได้ผลแบบนี้ครับ

> test3x <- NA
> test3x <- matrix(test3x, nrow=1000000, ncol=1000000)
Error in matrix(test3x, nrow = 1e+06, ncol = 1e+06) :
  too many elements specified

 

แต่ถ้าลดลงมาเหลือ ๑ หมื่น x ๑ หมื่น

> test3x <- NA
> test3x <- matrix(test3x, nrow=10000, ncol=10000)

 

ก็จะทำได้ แต่ R จะคิดอยู่แว๊บนึงครับ

 

matrix ขนาด ๔ หมื่น x ๔ หมื่น ยังได้อยู่ครับ

> test3x <- NA
> test3x <- matrix(test3x, nrow=40000, ncol=40000)

 

แต่เมื่อเพิ่มเป็น ๕ หมื่นจะไม่ได้แล้วครับ

> test3x <- NA
> test3x <- matrix(test3x, nrow=50000, ncol=50000)
Error in matrix(test3x, nrow = 50000, ncol = 50000) :
  too many elements specified

 

matrix ขนาด ๔ หมื่น x ๔ หมื่น หรือจำนวนข้อมูลทั้งหมดคือ ๔๐,๐๐๐ x ๔๐,๐๐๐ = ๑,๖๐๐,๐๐๐,๐๐๐ ข้อมูล

 

หนึ่งพันหกร้อยล้านข้อมูล

 

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

 

ทั้งนี้ข้อกำหนดนี้อาจจะขึ้นอยู่กับตัวแปรม R เองในการรองรับจำนวนข้อมูลหรือข้อจำกัดขี้อาจจะขึ้นอยู่กับตัวโปรแกรมระบบหรือตัว hardware ของเครื่องคอมพิวเตอร์เองก็ได้

 

อิอิอิ

 

เราเอง

 

เพลง: คำถามซึ่งไร้คำตอบ
ศิลปิน: Getsunova

 

 

หมวดหมู่บันทึก: เรื่องทั่วไป
สัญญาอนุญาต: ซีซี: แสดงที่มา-ไม่ใช้เพื่อการค้า-อนุญาตแบบเดียวกัน Cc-by-nc-sa
สร้าง: 03 มิถุนายน 2557 17:18 แก้ไข: 28 เมษายน 2563 17:32 [ แจ้งไม่เหมาะสม ]
ดอกไม้
สมาชิกที่ให้กำลังใจ: Ico24 คนธรรมดา, Ico24 ทดแทน, และ 2 คนอื่น.
สมาชิกที่ให้กำลังใจ
 
Facebook
Twitter
Google

บันทึกอื่นๆ

ความเห็น

บอกเลยว่าเพลงเพราะมากครับ ช่วงนี้ น้าลงเพลงวัยสะรุ่นถูกใจเราจังเลย

 

เอิ้ก เอิ้ก

 

"ใจสั่งมา"

อิอิอิ

เพลงเพราะทุกบันทึกครับน้อง ๒ ใย

อิอิอิ

เราเอง

คุณต้องทำการเข้าระบบก่อนแสดงความเห็น