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

Our Shangri-La
Ico64
Kittisakdi Choomalee

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

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

ก้าวย่างทางเดิน ลืมเลือนคืนวัน ดั้นด้นไป: Titanic ฉบับ rate R # ๔ [C]

ข้อมูลตัวอย่างข้อมูลหนึ่งที่ถูกนำมาใช้เป็นข้อมูลตัวอย่างสำหรับการวิเคราะห์ข้อมูลคือข้อมูล Titanic

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

 

ครั้งที่แล้วเราลองใช้ฟังก์ชัน data.frame() เปลี่ยนวัตถุ class table ให้เป็นกรอบข้อมูล (data frame) และพบว่ากรอบข้อมูลที่ได้เป็นข้อมูลสรุปของข้อมูลแต่ละกลุ่มตามเงื่อนไขของตัวแปร ๔ ตัวแปร

 

> data.frame(Titanic)
   Class    Sex   Age Survived Freq
1    1st   Male Child       No    0
2    2nd   Male Child       No    0
3    3rd   Male Child       No   35
4   Crew   Male Child       No    0
5    1st Female Child       No    0
6    2nd Female Child       No    0
7    3rd Female Child       No   17
8   Crew Female Child       No    0
9    1st   Male Adult       No  118
10   2nd   Male Adult       No  154
11   3rd   Male Adult       No  387
12  Crew   Male Adult       No  670
13   1st Female Adult       No    4
14   2nd Female Adult       No   13
15   3rd Female Adult       No   89
16  Crew Female Adult       No    3
17   1st   Male Child      Yes    5
18   2nd   Male Child      Yes   11
19   3rd   Male Child      Yes   13
20  Crew   Male Child      Yes    0
21   1st Female Child      Yes    1
22   2nd Female Child      Yes   13
23   3rd Female Child      Yes   14
24  Crew Female Child      Yes    0
25   1st   Male Adult      Yes   57
26   2nd   Male Adult      Yes   14
27   3rd   Male Adult      Yes   75
28  Crew   Male Adult      Yes  192
29   1st Female Adult      Yes  140
30   2nd Female Adult      Yes   80
31   3rd Female Adult      Yes   76
32  Crew Female Adult      Yes   20

 

จากผลลัพธ์ข้างต้นเราพบว่ามีบางเงื่อนไข/ ข้อมูลบางกลุ่มมีค่าของสดมภ์สุดท้ายหรือ Freq เป็น ๐ นั่นคือ ไม่มีผู้โดยสารคนใดอยู่ในกลุ่มนั้นเลย

 

หากเราจะสร้างข้อมูลข้อมูลที่มีคุณลักษณะของผู้โดยสารแต่ละคน (ระดับ เพศ อายุ การรอดชีวิต) ทางหนึ่งที่เราทำได้ก็คือการสร้างจำนวนกลุ่มให้มีจำนวนตามค่าของสดมภ์ Freq

 

กลุ่มของข้อมูลที่เราต้องสร้างข้อมูลซ้ำ จำนวนเท่ากับความถี่ของกลุ่ม คือ

> data.frame(Titanic)[which(data.frame(Titanic)[5]!=0),]
   Class    Sex   Age Survived Freq
3    3rd   Male Child       No   35
7    3rd Female Child       No   17
9    1st   Male Adult       No  118
10   2nd   Male Adult       No  154
11   3rd   Male Adult       No  387
12  Crew   Male Adult       No  670
13   1st Female Adult       No    4
14   2nd Female Adult       No   13
15   3rd Female Adult       No   89
16  Crew Female Adult       No    3
17   1st   Male Child      Yes    5
18   2nd   Male Child      Yes   11
19   3rd   Male Child      Yes   13
21   1st Female Child      Yes    1
22   2nd Female Child      Yes   13
23   3rd Female Child      Yes   14
25   1st   Male Adult      Yes   57
26   2nd   Male Adult      Yes   14
27   3rd   Male Adult      Yes   75
28  Crew   Male Adult      Yes  192
29   1st Female Adult      Yes  140
30   2nd Female Adult      Yes   80
31   3rd Female Adult      Yes   76
32  Crew Female Adult      Yes   20

 

ผมลองค้น ๆ ดู พบว่ามีคนเขียนฟังก์ชันสำหรับการทำซ้ำของข้อมูลจากความถี่ของแต่ละกลุ่มอยู่หลายคนเหมือนกัน

 

หลักการง่าย ๆ ก็คือการสร้างลูป (loop) สำหรับการทำงานนี้

 

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

 

แต่การ "ทำมือ" นั้นค่อนข้างจะทำงานซ้ำ ๆ กันหลายครั้งและไม่เหมาะกับข้อมูลที่มีเงื่อนไขซับซ้อนหรือจำนวนกลุ่มของข้อมูลมีจำนวนมาก (เพราะต้องเขียนบรรทัดคำสั่งให้ทำงานจำนวนมาก)

 

เพื่อไม่ให้เยิ่นเย้อมากเกินไปผมขอให้ท่านผู้อ่านที่รักทุกท่านดูบรรทัดคำสั่งทั้งหมดที่ใช้สร้างข้อมูลตามที่ต้องการเลยครับ

> titanix <- NA
> titanix <- matrix(titanix,nrow=2201, ncol=4)
> pclass <- rep("1st",35)
> sex <- rep("male", 35)
> age <- rep("child", 35)
> survived <- rep("No", 35)
> titanix[1:35,] <- cbind(pclass,sex,age,survived)
> head(titanix)
     [,1]  [,2]   [,3]    [,4]
[1,] "1st" "male" "child" "No"
[2,] "1st" "male" "child" "No"
[3,] "1st" "male" "child" "No"
[4,] "1st" "male" "child" "No"
[5,] "1st" "male" "child" "No"
[6,] "1st" "male" "child" "No"
> tail(titanix)
        [,1] [,2] [,3] [,4]
[2196,] NA   NA   NA   NA 
[2197,] NA   NA   NA   NA 
[2198,] NA   NA   NA   NA 
[2199,] NA   NA   NA   NA 
[2200,] NA   NA   NA   NA 
[2201,] NA   NA   NA   NA 
> pclass <- rep("3rd",17)
> sex <- rep("female", 17)
> age <- rep("child", 17)
> survived <- rep("No", 17)
> 36+17-1
[1] 52
> titanix[36:52,] <- cbind(pclass,sex,age,survived)
> titanix[36:52,]
      [,1]  [,2]     [,3]    [,4]
 [1,] "3rd" "female" "child" "No"
 [2,] "3rd" "female" "child" "No"
 [3,] "3rd" "female" "child" "No"
 [4,] "3rd" "female" "child" "No"
 [5,] "3rd" "female" "child" "No"
 [6,] "3rd" "female" "child" "No"
 [7,] "3rd" "female" "child" "No"
 [8,] "3rd" "female" "child" "No"
 [9,] "3rd" "female" "child" "No"
[10,] "3rd" "female" "child" "No"
[11,] "3rd" "female" "child" "No"
[12,] "3rd" "female" "child" "No"
[13,] "3rd" "female" "child" "No"
[14,] "3rd" "female" "child" "No"
[15,] "3rd" "female" "child" "No"
[16,] "3rd" "female" "child" "No"
[17,] "3rd" "female" "child" "No"
> pclass <- rep("1st",118)
> sex <- rep("male", 118)
> age <- rep("adult", 118)
> survived <- rep("No", 118)
> 53+118-1
[1] 170
> titanix[53:170,] <- cbind(pclass,sex,age,survived)
> pclass <- rep("2nd",154)
> sex <- rep("male", 154)
> age <- rep("adult", 154)
> survived <- rep("No", 154)
> 171+154-1
[1] 324
> titanix[171:324,] <- cbind(pclass,sex,age,survived)
> pclass <- rep("3rd",387)
> sex <- rep("male", 387)
> age <- rep("adult", 387)
> survived <- rep("No", 387)
> 325+387-1
[1] 711
> titanix[325:711,] <- cbind(pclass,sex,age,survived)
> pclass <- rep("Crew",670)
> sex <- rep("male", 670)
> age <- rep("adult", 670)
> survived <- rep("No", 670)
> 712+670-1
[1] 1381
> titanix[712:1381,] <- cbind(pclass,sex,age,survived)
> pclass <- rep("1st",4)
> sex <- rep("female", 4)
> age <- rep("adult", 4)
> survived <- rep("No", 4)
> 1382+4-1
[1] 1385
> titanix[1382:1385,] <- cbind(pclass,sex,age,survived)
> pclass <- rep("2nd",13)
> sex <- rep("female", 13)
> age <- rep("adult", 13)
> survived <- rep("No", 13)
> 1386+13-1
[1] 1398
> titanix[1386:1398,] <- cbind(pclass,sex,age,survived)
> pclass <- rep("3rd",89)
> sex <- rep("female", 89)
> age <- rep("adult", 89)
> survived <- rep("No", 89)
> 1399+89-1
[1] 1487
> titanix[1399:1487,] <- cbind(pclass,sex,age,survived)
> pclass <- rep("Crew",3)
> sex <- rep("female", 3)
> age <- rep("adult", 3)
> survived <- rep("No", 3)
> 1488+3-1
[1] 1490
> titanix[1488:1490,] <- cbind(pclass,sex,age,survived)
> pclass <- rep("1st",5)
> sex <- rep("male", 5)
> age <- rep("child", 5)
> survived <- rep("Yes", 5)
> 1491+5-1
[1] 1495
> titanix[1491:1495,] <- cbind(pclass,sex,age,survived)
> pclass <- rep("2nd",11)
> sex <- rep("male", 11)
> age <- rep("child", 11)
> survived <- rep("Yes", 11)
> 1496+11-1
[1] 1506
> titanix[1496:1506,] <- cbind(pclass,sex,age,survived)
> pclass <- rep("3rd",13)
> sex <- rep("male", 13)
> age <- rep("child", 13)
> survived <- rep("Yes", 13)
> 1507+13-1
[1] 1519
> titanix[1507:1519,] <- cbind(pclass,sex,age,survived)
> pclass <- rep("1st",1)
> sex <- rep("female", 1)
> age <- rep("child", 1)
> survived <- rep("Yes", 1)
> 1520+1-1
[1] 1520
> titanix[1520,] <- cbind(pclass,sex,age,survived)
> pclass <- rep("2nd",13)
> sex <- rep("female", 13)
> age <- rep("child", 13)
> survived <- rep("Yes", 13)
> 1521+13-1
[1] 1533
> titanix[1521:1533,] <- cbind(pclass,sex,age,survived)
> pclass <- rep("3rd",14)
> sex <- rep("female", 14)
> age <- rep("child", 14)
> survived <- rep("Yes", 14)
> 1534+14-1
[1] 1547
> titanix[1534:1547,] <- cbind(pclass,sex,age,survived)
> pclass <- rep("1st",57)
> sex <- rep("male", 57)
> age <- rep("adult", 57)
> survived <- rep("Yes", 57)
> 1548+57-1
[1] 1604
> titanix[1548:1604,] <- cbind(pclass,sex,age,survived)
> pclass <- rep("2nd",14)
> sex <- rep("male", 14)
> age <- rep("adult", 14)
> survived <- rep("Yes", 14)
> 1605+14-1
[1] 1618
> titanix[1605:1618,] <- cbind(pclass,sex,age,survived)
> pclass <- rep("3rd",75)
> sex <- rep("male", 75)
> age <- rep("adult", 75)
> survived <- rep("Yes", 75)
> 1619+75-1
[1] 1693
> titanix[1619:1693,] <- cbind(pclass,sex,age,survived)
> pclass <- rep("Crew",192)
> sex <- rep("male", 192)
> age <- rep("adult", 192)
> survived <- rep("Yes", 192)
> 1694+192-1
[1] 1885
> titanix[1694:1885,] <- cbind(pclass,sex,age,survived)
> pclass <- rep("1st",140)
> sex <- rep("female", 140)
> age <- rep("adult", 140)
> survived <- rep("Yes", 140)
> 1886+140-1
[1] 2025
> titanix[1886:2025,] <- cbind(pclass,sex,age,survived)
> pclass <- rep("2nd",80)
> sex <- rep("female", 80)
> age <- rep("adult", 80)
> survived <- rep("Yes", 80)
> 2026+80-1
[1] 2105
> titanix[2026:2105,] <- cbind(pclass,sex,age,survived)
> pclass <- rep("3rd",76)
> sex <- rep("female", 76)
> age <- rep("adult", 76)
> survived <- rep("Yes", 76)
> 2106+76-1
[1] 2181
> titanix[2106:2181,] <- cbind(pclass,sex,age,survived)
> pclass <- rep("Crew",20)
> sex <- rep("female", 20)
> age <- rep("adult", 20)
> survived <- rep("Yes", 20)
> 2182+20-1
[1] 2201
> titanix[2182:2201,] <- cbind(pclass,sex,age,survived)
> titanix <- data.frame(titanix, stringsAsFactors=F)
> colnames(titanix) <- c("pclass","sex","age","survived")
> table(titanix)
, , age = adult, survived = No

      sex
pclass female male
  1st       4  118
  2nd      13  154
  3rd      89  387
  Crew      3  670

, , age = child, survived = No

      sex
pclass female male
  1st       0   35
  2nd       0    0
  3rd      17    0
  Crew      0    0

, , age = adult, survived = Yes

      sex
pclass female male
  1st     140   57
  2nd      80   14
  3rd      76   75
  Crew     20  192

, , age = child, survived = Yes

      sex
pclass female male
  1st       1    5
  2nd      13   11
  3rd      14   13
  Crew      0    0

> head(titanix, n=10)
   pclass  sex   age survived
1     1st male child       No
2     1st male child       No
3     1st male child       No
4     1st male child       No
5     1st male child       No
6     1st male child       No
7     1st male child       No
8     1st male child       No
9     1st male child       No
10    1st male child       No

 

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

 

อิอิอิ

 

เราเอง

 

เพลง:
ศิลปิน:

หมวดหมู่บันทึก: เรื่องทั่วไป
คำสำคัญ (keywords): bad practice  r  Titamic dataset  ข้าวยำ  เฉาก๊วย
สัญญาอนุญาต: ซีซี: แสดงที่มา-ไม่ใช้เพื่อการค้า-อนุญาตแบบเดียวกัน Cc-by-nc-sa
สร้าง: 30 เมษายน 2557 00:02 แก้ไข: 01 พฤษภาคม 2563 09:30 [ แจ้งไม่เหมาะสม ]
ดอกไม้
สมาชิกที่ให้กำลังใจ: Ico24 Ikkyu, Ico24 ServiceMan, และ 2 คนอื่น.
สมาชิกที่ให้กำลังใจ
 
Facebook
Twitter
Google

บันทึกอื่นๆ

ความเห็น

เข้าทำนอง 2+2+2+2 = 8 ก่อน 2*4=2^3=.... หรือเปล่าครับ

เข้าใจ concept ก่อนครับว่าที่มาที่ไป หรือหลักการนั้นคืออะไร

อิอิอิ

เราเอง

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