วันพฤหัสบดีที่ 20 กุมภาพันธ์ พ.ศ. 2563

โปรแกรม R บทที่ 4


บทที่ 4
Multivariate Data

            ข้อมูลที่ประกอบด้วยตัวแปรมากกว่า 2 ตัว นั้นสามารถทำการสรุปและศึกษาลักษณะของข้อมูลชุดนี้ได้ด้วยวิธีที่คล้ายคลึงกับวิธีที่ใช้กับข้อมูลที่มีตัวแปรเดียวและสองตัวแปร ถึงแมว่าจะมีความแตกต่างในเรื่องการศึกษาความสัมพันธ์ของ ตัวแปรหลายตัวก็ตาม ซึ่งความแตกต่างนี้สามารถแก้ไขได้โดยการพิจารณาความสัมพันธ์ระหว่างตัวแปรเหล่านี้พร้อมๆ กัน หรือใช้วิธีที่กำหนดให้ตัวแปรหนึ่งมีค่าคงที่ในขณะที่พิจารณาตัวแปรตัวอื่นๆ
4.1 Viewing Multivariate Data
           
ในบทนี้เราจะพิจารณาถึงตัวอย่างของข้อมูลที่ประกอบด้วยตัวแปรหลายตัว  3 ตัวอย่าง คือ การสรุปข้อมูลที่ได้จากการสำรวจ (ข้อมูลเชิงกลุ่ม) การเปรียบเทียบตัวอย่างที่เป็ นอิสระกันหลายชุด และการหาความสัมพันธ์ระหว่างตัวแปรหลายๆตัว
           
4.1.1 การสรุปข้อมูลเชิงกลุ่ม
            จากที่ผ่านมาเราใช้ตารางในการทำการสรุปสำหรับข้อมูล 2 ตัวแปร และเราสามารถใช้ตารางในการทำการสรุปเกี่ยวกับ ข้อมู ลหลายตัวแปรได้เช่นเดียวกัน อย่างไรก็ตามตารางที่ ได้จะแสดงเพียงความสัมพันธ์ระหว่างตัวแปรทีละสองตัวเท่านั้น ทำให้เราต้องใช้ตารางหลายตารางในการพิจารณาตัวแปรหลายๆตัว
ตัวอย่างที่
4.1
           
ข้อมู ลชุด student.expenses (UsingR) ประกอบด้วยผลที่ ได้จากการสำรวจ โดยที่ นักศึกษาที่ เป็นตัวอย่าง แต่ละคนจะถูกถามว่าเขามีหนี้สินประเภทใดอยูใน 5 ประเภท
> library(UsingR)
> data(student.expenses)
> student.expenses

    
cell.phone cable.tv dial.up cable.modem car
1          Y          Y          Y          N          Y         
2          Y          N          N          N          N
3          N          N          N          N          Y
4          Y          Y          N          Y          Y
5          N          N          N          N          N
6          Y          N          Y          N          Y
7          Y          N          N          Y          N
8          N          N          N          N          Y
9          Y          Y          N          N          Y
10         Y          N          Y          N          N
จากข้อมูลนี้จะเห็นได้ว่าข้อมูลมีลักษณะเป็ นตารางขนาดเล็ก แต่ก็ยังคงมีรายละเอียดมากเกินไปที่เราจะสามารถ
มองเห็นแนวโน้มของข้อมูลได้ง่าย เราต้องการที่จะสรุปเกี่ยวกับข้อมูลนี้โดยใช
R ซึ่งทำได้โดยใช้คำสั่ง table() ในการสรางตาราง 2 ทาง เมื่อพิจารณาถึงความสัมพันธ์ระหว่างการมี cell-phone และรถยนต์
> attach(student.expenses)
> names(student.expenses)
[1] "cell.phone" "cable.tv"  "dial.up" "cable.modem" "car"
> table(cell.phone,car)
            
car
cell.phone  N    Y
            
 N  1     2
              
Y  3     4
            จากตารางที่ได้จะเห็นได้ว่านักศึกษาเกือบทั้งหมดจะมี
cell-phone หรือ รถยนต์ หรืออย่างใดอย่างหนึ่ง และมีนักศึกษา เพียงคนเดียวเท่านั้นที่ไม่มีทั้งสองอย่างนี้
Three-way contigency tableหรือ n-way contingency table เป็ นตารางที่แสดงความสัมพันธ์ระหว่างตัวแปร 3 ตัว หรือn ตัว วิธีการสร้างตารางแบบนี้คือ การกำหนดระดับของตัวแปรหนึ่ง ในขณะที่สร้าง หรือn ตัว วิธีการสร้างตารางแบบนี้คือ การกำหนดระดับของตัวแปรหนึ่ง ในขณะที่สร้างตารางสองทางสำหรับตัวแปร สองตัวที่เราสนใจ เช่น เราสนใจศึกษาว่าค่าใช้จ่ายสำหรับ cable modem มีผลกระทบต่อความสัมพันธ์ระหว่างการมี cell-phone และการมีรถยนต์หรือไม่ เราสามารถสร้างตารางสามทางได้ดังนี้
> table(cell.phone,car,cable.modem)
, , cable.modem = N
             
car
cell.phone N   Y
            
 N 1    2
             
Y 2    3
, , cable.modem = Y
             
car
cell.phone N   Y
            
N  0    0
              
Y  1   1
             จากตารางที่ได้จะเห็นว่านักศึกษาที่มีค
าใช้จ่ายเกี่ยวกับ cable modem นั้นต้องตัดค่าใช้จ่ายเกี่ยวกับ cell-phone และรถยนต์ออกไป จากคำสั่ง table() จะเห็นได้ว่าฟังก์ชันนี้จะใช้ตัวแปรสองตัวแรกในการสร้างตารางหลัก และใช้ตัวแปรตัวที่สามในการสร้างตารางที่ แตกต่างกันสำหรับแต่ละระดับของตัวแปรตัวนี้
อย่างไรก็ตามการสร้างตารางลักษณะนี้ทำให้เปลืองพื้นที่ในการแสดงผลลัพธ์ เราสามารถสร้างตารางสามทางได้อีกรูปหนึ่งโดยใช
คำสั่ง ftable() (flatten table) ดังนี้
> ftable(table(cell.phone,car,cable.modem),
+ col.vars=c("cable.modem", "car"))                    # specify column variables
           
cable.modem N          Y
                        car    N Y N Y
cell.phone
N                                1 2 0 0
Y                                2 3 1 1

 
            4.1.2 การเปรียบเทียบตัอย่างหลายกลุ่มที่เป็นอิสระกั
            เมื่อเรามีข้อมูลหลายๆตั
แปรและตัแปรเหล่านี้ป็ นชนิดเดียวกั เรามัต้องการที่ จะเปรียบเทียบตัแปรเหล่านี้เกี่ยวกั ค่ากลาง การกระจาย และการแจกแจง ซึ่งการเปรียบเทียบเหล่านี้สามารถทำได้โดยง่ายโดยการใช้ Boxplots
ตัอย่างที่
4.2
            ข้อมูลชุด
ewr (UsingR) เป็ นข้อมู ลเกี่ยวกั taxi-in-and-out ของเครื่องบินที่ลงจอดที่ สนามบิน Newark Liberty ซึ่ งประกอบด้วยระยะทางเฉลี่ ยรายเดือนที่ เครื่องบินใช้ taxi ในการขึ้น-ลง สนามบินของสายการบิน 8 สายการบิน ข้อมูลนี้ใช้เพื่อศึกษาว่าเครื่องบินของสายการบินใดที่ ขึ้น-ลง สนามบินเร็วกว่าสายการบินอื่น เราสร้าง Boxplots เพื่อ ศึกษาลักษณะของข้อมูลของสายการบินทั้ง 8 ดังนี้
> attach(ewr)
> names(ewr)
[1] "Year"  "Month"  "AA"  "CO"  "DL"  "HP"  "NW"
[8] "TW"     "UA"      "US"   "inorout"
> boxplot(AA, CO, DL, HP, NW, TW, UA, US)
ได
กราฟดัรูปที่ 4.1 ซึ่งแสดงให้เห็นว่าสายการบินที่ 2 (Continental) เป็ นสายการบินที่แย่ที่สุด เนื่องจากมีคาต่ำสุด ค่าสูงสุด และค่ามัยฐานของข้อมูลมากที่สุดเมื่อเทียบกัสายการบินอื่นๆ อย่างไรก็ตามสายการบินที่ 4 (America West) มีค่ามัธยฐานมากที่สุด

รูปที่
4.1: Boxplot ของข้อมูล taxi-in-and-out
            4.1.3 Comparing Relationships
           
เราสามารถใช้ Scatterplot ในการศึกษาความสัมพันธ์ระหว่ างตัวแปรมากกว่าสองตัวได้ โดยการสร้าง Scatterplot หลายๆรูป หรือสร้างกราฟรูปเดียวแต่ใช้เครื่องหมายที่แตกต่างกันหรือสีที่แตกต่างกันในการจำแนกแต่ละคู่ของตัวแปรก็ได้
ตัวอย่างที่
4.3
           
ชุดข้อมูล babies (UsingR) มีตัวแปรหลายตัวที่เก็บรวบรวมมาจากมารดามือใหม่ ซึ่งเป็นส่วนหนึ่งของ
การศึกษาเกี่ยวกับสุขภาพและพัฒนาการของเด็ก ตัวแปรเหล่านี้ประกอบด้วย ระยะเวลาของการตั้งครรภ์ (
gestation period) อายุของมารดา (maternal age) ปริมาณการสูบบุหรี่ของมารดา (smoke) และปัจจัยอื่นๆ เช่น ระดับการศึกษาของมารดา ซึ่งในข้อมูลชุดนี้มีตัวแปรทั้งหมด 23 ตัวแปร
            จากข้อมูลชุดนี้ เราจะสร้าง
scatter plot ที่แสดงความสัมพันธ์ระหว่างระยะเวลาในการตั้งครรภ์และน้ำหนักแรกเกิดของทารก โดยแบ่งกลุ่มตามการสูบบุหรี่ของมารดา ซึ่งเราจะใช้ลักษณะของจุดที่แตกต่างกันในการระบุกลุ่มของข้อมูลตามการสูบบุหรี่ของมารดา
> par(mfrow = c(1,2), cex = 0.65)
> gestation[gestation == 999] = NA                    # 999 is code for NA
> plot(gestation,wt)                                            # scatterplot
> plot(gestation,wt,pch=smoke)                          # different plot characters
> table(smoke)                                                  # values of plot characters
smoke   0     1     2     3    9
          
544  484  95  103  10
> legend(locator(1),
+ legend=c("never", "yes", "until pregnant", "long ago", "unknown"),
+ pch=c(0:3,9))
            จากชุดคำสั่งในข้างต้นจะได้กราฟดังรูปที่
4.2 ในกราฟรูปแรกทางซ้ายมือจะเห็นได้ว่ายิ่งระยะเวลาในการตั้งครรภ์มากน้ำหนักแรกเกิดของทารกจะมากขึ้นด้วย นอกจากนั้นเรายังสามารถศึกษาเพิ่มเติมได้อีกว่าปัจจัยอื่นๆ เช่น การสูบบุหรี่ของมารดามีผลกระทบต่อความสัมพันธ์นี้หรือไม่ได้โดยดู จากกราฟทางด้านขวามือ
ฟังก์ชัน table() ใช้ช่วยในการหาช่วงของค่าของการสูบบุหรี่ของมารดา เราสามารถดูจาก help page ของ babies ได้ว่าค่าเหล่านี้หมายถึงอะไร
                    
                     รูปที่ 4.2: Scaterplots of gestation versus weight by smoke factor
            อย่างไรก็ตามเราจะเห็นได้ว่าในรูปที่ 4.2 มีความหนาแน่นของจุดมากเกินไป ทำให้เราเห็นลักษณะความสัมพันธ์ในแต่ละกลุ่มไม่ชัดเจน ดังนั้นเราอาจใช้สีที่แตกต่างกันเข้ามาช่วยเพื่อให้กราฟดูได้ง่ายขึ้น โดยใช้ argument col= ในฟังก์ชัน plot() เข้ามาช่วย ในตัวอย่างนี้เราจะใช้ rainbow() เพื่อสร้างสี 5 สี ในการแยกความแตกต่างระหว่างค่าของsmoke ดังนี้
> smoke[smoke == 9] = 4                                   # change "9" to a "4"
> plot(gestation,wt,col=rainbow(5)[smoke+1])     # add 1 at smoke
Plotting additional points and functions
            ในบางครั้งเราต้องการเพิ่มจุดหรือเส้นเข้าไปในกราฟที่สร้างไว้ เช่นการเพิ่มเส้นถดถอยเข้าไปใน scatterplot เป็ นต้นเพื่อช่วยให้เข้าใจถึงฟังก์ชันการพลอตกราฟใน R เราควรทราบว่าฟังก์ชันที่ใช้ในการสร้างกราฟนั้นแบ่งเป็ นสองชนิดคือ"high-level" เช่น plot() และ "low-level" เช่น abline() ความแตกต่างระหว่างฟังก์ชันสองชนิดนี้คือ ฟังก์ชัน "high-level" จะเป็ นการสร้างกราฟลงในหน้าต่างของกราฟ แต่ฟังก์ชัน "low-level" จะเป็ นการเพิ่มกราฟเข้าไปในกราฟที่สร้างไว้ก่อนแล้วจากฟังก์ชัน "high-level" ตารางที่ 4.1 รวบรวมฟังก์ชันสำหรับการสร้างกราฟที่มีประโยชน์
ตารางที่ 4.1: Various plotting functions for creating or adding to figures

plot()     ใช้สร้าง scatterplot ซึ่งกราฟจะเป็ นกราฟจุดถ้าใช้เงื่อนไขเป็ น type = "l" จะเป็ นการสร้าง
              กราฟเส้น และยัมีเงื่อนไขอื่นๆให้เลือกใช้
points()  เป็น"low-level"ฟังก์ชันในการสร้างกราฟที่มีเงื่อนไขต่างๆเหมือนplot()
lines()    คล้ายกับpoints()แต่ละมีการเชื่อมจุดด้วยเส้นตรง
ablines() เป็นฟังก์ชัที่ใช้ในการเพิ่มเส้นเข้าไปในรูป มีเงื่อนไขคือ a= และ b= เพื่อพลอตเส้นy=
                a+ bx และมีเงื่อนไข h= และ v= เพื่อพลอตเส้นนอนและเส้นตั้งฉาก
              curve() เป็นทั้ง "high-level" และ "low-level" ฟังก์ชัน เพื่อสร้างกราฟของฟังก์ชันของx เมื่อใช้เงื่อนไข
               
add=TRUE จะเป็นการเพิ่มกราฟเส้นโค้งเข้าไปในรูปที่มีอยูแล้ว โดยใช้สเกลกับค่าของx แต่ถ้าไม่มี
               เงื่อนไข
add=TRUE จะเป็นการสร้างกราฟใหม่ในช่วงที่กำหนดโดย from=และ to= โดยมี default
              
เป็ น 0 และ 1
rug()       เป็ นการเพิ่มเส้นไปตามแนวแกนx หรือy เพื่อแสดงค่าของข้อมูลในชุดข้อมูลตัแปรเดียว มี defualt
               เป็ นการสร้างเส้นบนแกน
x และใช้ side=2 เพื่อสร้างเส้นตามแกนy
arrows() เพิ่อลูกศรในรูป
text()       เพิ่มตัอัษรในรูปที่ตำแหน่งที่กำหนด
title()      เพิ่มชื่อให้กักราฟ มีเงื่อนไขคือ main= จะเพิ่มชื่อหลัของกราฟ sub= เพิ่มชื่อรองของกราฟ
               xlab= และ ylab= เพิ่มชื่อให้แกนx และแกนy
legend()  เพิ่มlegendให้กับกราฟ  

             

รูปที่
4.3: Scaterplots of gestation versus weight by smoke factor (using colour to separate values of smoke)
เราจะลองสร้างกราฟของตัวอย่างเข้าไปในกราฟ โดยเริ่มจากการสร้าง scatterplot ก่อน
> gestation[gestation == 999] = NA
> f = wt[smoke == 0] ~ gestation[smoke == 0]
> plot(f, xlab="gestation", ylab="wt")

> abline(lm(f))                                                   #> f1 = wt[smoke == 1] ~ gestation[smoke == 1]
> points(f1,pch=16)
> abline(lm(f1),cex=2,lty=2)
> legend(150,175,legend=c("0=never smoked","1=smokes now"),
+ pch=c(1,16), lty=1:2)
> detach(babies)
ได้กราฟดังรูปที่
4.4
                       


4.2 R Basics: Data Frames and Lists
            สำหรับข้อมูลที่ ประกอบด้วยตัวแปรหลายๆตัว เราสามารถเข้าถึงและทำงานกับตัวแปรแต่ละตัวได้อย่างเป็ นอิสระกันอย่างไรก็ตามในบางครั้งการเข้าถึงตัวแปรทุกตัวในคราวเดียวกันก็อาจเป็ นประโยชน์ในการวิเคราะห์ข้อมูลได้ เช่นทำให้ง่ายต่อการการเก็บบันทึกงานของเรา และง่ายต่อการจัดการ ใน R ชุดของข้อมูลที่ประกอบด้วยตัวแปรตั้งแต่หนึ่งตัวขึ้นไปนั้น เรียกว่า data frame เราใช้ Data frame ในการเก็บขอมูลในรูปของตาราง โดยที่แต่ละแถวจะเป็ นค่าสังเกตของหน่วยตัวอย่างเดียวกันและแต่ละคอลัมน์คือเวกเตอร์ข้อมูลประกอบด้วยค่าสังเกตของตัวแปรๆหนึ่ง ตัวแปรใน data frame หนึ่งๆไม่จำเป็นต้องเป็ นชนิดเดียวกัน บางตัวอาจเป็ นตัวแปรเชิงปริมาณ บางตัวอาจเป็ นตัวแปรเชิงกลุ่มก็ได้ แต่ในคอลัมน์เดียวกันข้อมูลต้องเป็ นชนิดเดียวกัน  ถ้าตารางข้อมูลประกอบด้วยเวกเตอร์ข้อมูลที่เป็ นชนิดเดียวกันทั้งหมด เช่น เป็นขอมูลเชิงปริมาณทั้งหมดตารางข้อมูลนี้สามารถเก็บไว้ในรูปของเมตริกซ์ได้เช่นเดียวกัน ถึงแม้ว่า data frame อาจจะไม่ใช่มตริกซ์ (เนื่องจากข้อมูลในdata frame ไม่จำเป็นต้องเป็ นตัวเลข) แต่การเข้าถึงข้อมูลนั้นทำได้ในทำนองเดียวกัน   List เป็นการเก็บขอมูลในรูปแบบทั่วๆไป และมีความยืดหยุ่นมากกว่าการใช้ data frame เราสามารถใช้ list ในการเก็บข้อมูลของตัวแปรที่มีขนาดไม่เท่ากันได้ list อาจประกอบด้วยเวกเตอร์ข้อมูล data frame งก์ชัน หรือแม้กระทั่งอีก list หนึ่งก็ได้
           
Data frame นั้นถือเป็น list ชนิดพิเศษ ซึ่งสามารถเข้าถึงข้อมูลใน data frame ได้ทั้งแบบของเมตริกซ์และ list
           
4.2.1 การสร้าง Data Frame หรือ List
            เราสามารถสร้าง data frame ได้โดยใช้ฟังก์ชัน data.frame() และสร้าง listโดยใช้ฟังก์ชัน list() และสามารถเรียกใช้ data frame วยฟังก์ชัน read.table() หรือ read.csv() เช่น
> x = 1:2                                                           # define x
> y = letters[1:2]                                                # y = c("a","b")
> z = 1:3                                                           # z has 3 elements, x,y only 2
> data.frame(x,y)                                               # rectangular, cols are variables
      
x   y 
 
1   1   a
 
2   2   b
> data.frame(x,y,z)                                             # not all the same size
Error in data.frame(x, y, z) : arguments imply differing number of rows: 2, 3
            จะเห็นได้มี
error เกิดขึ้น เนื่องจากตัวแปรแต่ละตัวหรือแต่ละคอลัมน์มีขนาดไม่เท่ากัน ซึ่งตามคุณสมบัติของ dataframe นั้นตัวแปรทุ กตัวใน data frame ต้องมีขนาดเท่ ากัน ดังนั้นหากตัวแปรที่ เราต้องการสร้างให้เป็นชุดข้อมูลมีขนาดไม่เท่ากัน เราสามารถสร้างได้ในรูปของ list ดังต่อไปนี้
> list(x,y,z)
[[1]]
[1] 1 2
[[2]]
[1] "a" "b"
[[3]]
[1] 1 2 3
            พิจารณาจากผลที่ได้จากการใช้
list(x,y,z) สัญลักษณ[[1]] บ่งชี้ถึงเวกเตอร์ข้อมูลที่ 1 ในขณะที่ [1] ในบรรทัดถัดมาบงชี้ถึงตำแหน่งของค่าสังเกตในเวกเตอร์ข้อมูลนั้น หากเราต้องการเข้าถึงข้อมูลใน list สามารถทำได้ดังนี้ เช่นเราต้องการเข้าถึงเวกเตอร์ข้อมูล x ใน list
> data = list(x,y,z)
> data[[1]]
[1] 1 2

หรือต้องการเข้าถึงค่าสังเกตตำแหน่งที่
1 ในเวกเตอรx
> data[[1]][1]
[1] 1
การเพิ่มชื่อใหกับ data frame หรือ list
            เราสามารถกำหนดชื่อให้กับแต่ละองค์ประกอบใน data fame และ list ได้โดยใช้ฟังก์ชัน names() เมื่อ
ใช้ฟังก์ชัน
da-ta.frame(x,y) จะมีการกำหนดชื่อ x และ y เปนชื่อของเวกเตอร์ข้อมูลโดยอัตโนมัติ แต่ถ้าใช้ list() จะไม่มีการกำหนดชื่อให้
> list(x.name=x,"y name"=y)
$x.name
[1] 1 2
$"y name"
[1] "a" "b"
            เราสามารถใช้ฟังก์ชัน
names() ในการกำหนดหรือเรียกชื่อของข้อมูลได้ ดังนี้
> eg = data.frame(x,y)                                        # store the data frame
> names(eg)                                                      # the current names
[1] "x" "y"
> names(eg) = c("x.name","y.name")
                   # change the names
> names(eg)
[1] "x.name" "y.name"
            สำหรับ
data frame เราสามารถกำหนดและเรียกใช้ข้อมูลตามชื่อคอลัมน์และชื่อแถวได้ด้วยฟังก์ชัน colnames() และ rownames() ซึ่งทั้งสองแบบนี้สามารถกำหนดในคราวเดียวกันด้วยฟังก์ชัน dimnames()
ขนาดของ data frame หรือ list
            Data frame นั้นประกอบด้วยตัวแปรจำนวนหนึ่ง และแต่ละตัวแปรนั้นจะมีขนาดเทากัน เราสามารถหาขนาดของ data frame ได้ด้วยฟังก์ชัน dim() เช่น
> library(UsingR)
> dim(ewr)                                                        # number of rows and columns
[1] 46 11                                                                # number of cols is 2nd
> dim(ewr)[2]
[1] 11
            จำนวนแถวและคอลัมน์นั้นสามารถหาได้โดยตรงด้วยฟังก์ชัน
nrow() และ ncol()
           
4.2.2 การเข้าถึงค่าต่างๆใน Data Frame
            ค่าต่างๆใน data frame นั้นสามารถเข้าถึงได้หลายวิธี เช่น เข้าถึงโดยการใช้ชื่อของตัวแปร นอกจากนั้นเรายังสามารถ เข้าถึงค่าสังเกตในแต่ละตัวแปรทีละค่าหรือทีละหลายๆคาได้
การเข้าถึงตัวแปรต่างๆใน
data frame โดยการใช้ชื่อ
           
โดยปกติเรามักเข้าถึงข้อมูลใน data frame โดยการใช้ฟังก์ชัน attach() data frame นั้น แล้วเข้าถึงตัวแปรด้วยชื่อของตัวแปรเหล่านั้น ซึ่งการทำแบบนี้อาจทำให้เกิดความสับสนในบางครั้ง เนื่องจากการใชattach() โปรแกรม R จะ copyตัวแปรที่เราเรียกมา เมื่อมีการเปลี่ยนแปลงค่าใดๆในตัวแปรจะเป็ นการเปลี่ยนที่ตัว copy ไมใช่การเปลี่ยนที่ dataframe ดังนั้นค่าของตัวแปรใน data frame จะเป็ นค่าเดิม ส่งผลให้เวลาทำงานจะพบว่าตัวแปรชื่อเดียวกันแต่มีค่าของตัวแปรแตกตางกัน
            ตัวอย่างต่อไปนี้เป็ นการสร้าง
data frame โดยใช้ data.frame() แล้ว attach ไวพิจารณาผลที่ได้เมื่อมีการเปลี่ยนข้อมูล
> x = data.frame(a=1:2,b=3:4)                            # make a data frame
> a                                                                    # a is not there
Error: Object "a" not found

> attach(x)                                                         # now a and b are there
> a
[1] 1 2
> a[1] = 5                                                          # assignment
> a
[1] 5 2
> x                                                                   # not x though
        
a   b
    
1  1   3
    
2  2  4
> detach(x)                                                        # remove x
> a                                                                    # a is there and changed
[1] 5 2
> x                                                                   # x is not changed
        
a    b
   
1   1    3
   
2   2   4
การเข
าถึงข้อมูลใน data frames โดยการใช้ [ , ]
            การเข้าถึงข้อมูลใน data frame สามารถทำได้โดยการอ้างถ์งชื่อคอลัมน์ (เลขคอลัมน์) และ/หรือ ชื่อแถว (เลขแถว)โดยมีรูปแบบดังนี้
dataframe’s name[row,column]
            ในตัวอย่างต่อไปนี้เราได้สร้าง
data frame แบบง่ายๆที่ประกอบด้วยตัวแปร 2 ตัว โดยที่แตละตัวมีขนาดเท่ากับสาม แล้วเพิ่มชื่อแถวให้กับ data frame นี้
> df = data.frame(x=1:3,y=4:6)                           # add in column names              
> rownames(df) = c("row 1", "row 2", "row 3")    # add row names
> df
              
x y
row       1 1 4
row        2 2 5
row       3 3 6
>df[3,2]                                                            # row=3,col=2
[1] 6
> df["row 3", "y"]
                                              # by name
[1] 6
> df[1:3,1]
                                                        # rows 1, 2 and 3; column 1
[1] 1 2 3
> df[1:2,1:2]
                                                      # rows 1 and 2, columns 1 and 2
         
x y
row    1 1 4
row    2 2 5
> df[,1]                                                             # all rows, column 1, returns vector
[1] 1 2 3
> df[1,]
                                                             # row 1, all columns
         
x y
row   1 1 4
> df[c(T,F,T),]                                                  # rows 1 and 3 (T=TRUE)
         x y
row  1 1 4
row  3 3 6

ตัวอย
างที่ 4.4
           
จากข้อมูลชุด babies (UsingR) เราต้องการศึกษาความสัมพันธ์ระหว่าง gestation, wt, age และ inc
ก่อนที่จะทำการวิเคราะห์ข้อมูลชุดนี้ได้ เราต้องทำการจัดการกับข้อมูลก่อน เนื่องจากตัวแปรบางตัวมีรหัสพิเศษสำหรับข้อมูลสูญหาย (
NA) เมื่อพิจารณาเอกสารประกอบของข้อมูลชุดนี้ พบว่าตัวแปร gestation ใช้ 999 ตัวแปร ageใช้ 99 และตัวแปร inc เป็ นตัวแปรเชิงกลุ่มใช้ 98 เป็ น "not available"
> attach(babies)
> gestation[gestation == 999] = NA
> age[age == 99] = NA
> inc[inc == 98] = NA
> pairs(babies[, c("gestation", "wt", "age", "inc")])
ไดกราฟดังรูปที่ 4.5 ซึ่งไม่ใช่กราฟที่ถูกต้องเนื่องจากข้อมูลใน data frame ไม่ได้มีการเปลี่ยนแปลง
รูปที่ 4.5: Scatterplot matrix of four variables from babies: not correct
วิธีที่ดีกว่าในการเปลี่ยนค่าของข้อมูล คือการหาตำแหน่งของข้อมูลที่เป็นค่าสูญหายของตัวแปรเหล่านี้ และดึงค่า เหล่านี้ออกไปเมื่ อมีการพลอตกราฟ
> rm()
> detach(babies)
> attach(babies)
> not.these = (gestation == 999) | (age == 99) | (inc == 98)
> tmp = babies[!not.these, c("gestation", "age", "wt", "inc")]
> pairs(tmp)
> detach(babies)
ไดกราฟดังรูปที่ 4.6

ตัวอยางที่ 4.5ตัวอย่างนี้จะแสดงการเข้าถึงข้อมูลโดยใช้ logical vectors: จากข้อมูลชุด ewr (UsingR) เราต้องการแบงข้อมูลตามตัวแปร inorout ซึ่งมีค่าเป็น in หรือ out ในชุดข้อมูลนี้ คอลัมน์ที่ 3 ถึง 10 เป็ นข้อมูลของแต่ละสายการบิน เราสามารถสร้าง boxplot เพื่อเปรียบข้อมูลแบ่งตามตัวแปร inorout ได้ดังนี้
attach(ewr)
> par(mfrow=c(1,2), cex = 0.6)
> boxplot(ewr[inorout == "in", 3:10], main = "Taxi in")
> boxplot(ewr[inorout == "out", 3:10], main = "Taxi out")

ได้กราฟดังรูปที่
4.7
การใช้คำสั่ง subset( ) เป็ นอีกทางเลือกหนึ่งในการเข้าถึงข้อมูลใน data frame เพียงบางส่วน แทนการใช้ [ , ] โดยมีรู ปแบบดังนี้
new.df = subset(old.df, subset = ..., select=...)
Argument subset = ในคำสั่งนี้ที่ใช้ในการกำหนดว่าจะเลือกทำงานกับแถวใดใน data frame บ้าง ส่วน select = ใช่ในการกำหนด column ที่จะทำงานด้วย โดยกำหนดในรูปของเวกเตอร์ของชื่อตัวแปรที่ต้องการ ต่อไปนี้เป็นตัวอย่างการใช้ subset

รูปที่
4.6: Scatterplot matrix of four variables from babies

รูปที่ 4.7: Taxi in and out times by airline
> library(UsingR)
> data(ewr)
> ewr.in = subset(ewr, subset = inorout =="in", select = 3:10)
> ewr.out = subset(ewr, subset = inorout =="out", select = 3:10)
> par(mfrow=c(1,2))
ซึ่งจะให้ผลเช่นเดียวกับรูปที่ 4.7
การเรียงลำดับข้อมูลใน data frame ตามคอลัมน์ใดคอลัมน์หนึ่งสามารถทำได้โดยใช้คำสั่ง sort( ) ดังตัวอย่างต่อไปนี้
ตัวอย่างที่
4.6
            ข้อมูลชุด
mtcars เราจะเรียงลำดับระยะทางเป็ นไมล์ต่อแกลลอน ซึ่งเป็ นตัวแปรชื่อ mpg ที่อยู่ใน data
frame ชื่อ mtcars ได้ดังนี้
> attach(mtcars)
> sort(mpg)
[1] 10.4 10.4 13.3 14.3 14.7 15.0 15.2 15.2 15.5
[10] 15.8 16.4 17.3 17.8 18.1 18.7 19.2 19.2 19.7
[19] 21.0 21.0 21.4 21.4 21.5 22.8 22.8 24.4 26.0
[28] 27.3 30.4 30.4 32.4 33.9
หรือเราเรียงลำดับจากมากไปหาน้อยได้ดังนี้
> sort(mpg, decreasing=TRUE)
[1] 33.9 32.4 30.4 30.4 27.3 26.0 24.4 22.8 22.8
[10] 21.5 21.4 21.4 21.0 21.0 19.7 19.2 19.2 18.7
[19] 18.1 17.8 17.3 16.4 15.8 15.5 15.2 15.2 15.0
[28] 14.7 14.3 13.3 10.4 10.4
ในบางครั้งเราอาจจะต้องการเรียงลำดับข้อมูลใน
data frame ตามคอลัมน์ใดคอลัมน์หนึ่งใน data frame นั้น ซึ่งการเรียงลำดับข้อมูลในลักษณะนี้ไม่สามารถใช้คำสั่ง sort( ) ได้ เราต้องใช้คำสั่ง order( ) เข้ามาช่วย ซึ่งคำสั่งนี้จะให้ค่ากลับมาเป็ นเวกเตอร์ของลำดับของตัวแปรนั้น เช่น order(x) จะได้เวกเตอร์ของลำดับของเวคเตอร์ x ที่มีค่าจากน้อยไปหามาก ดังนั้นการเรียงลำดับข้อมูลที่มีหลายตัวแปรพร้อมกัน จึงทำได้ดังนี้
> mtcars[order(mpg),]                                        # sort mtcars by mpg
                                 
mpg  cyl    disp    hp    drat   wt    qsec    vs  am   gear   carb
Cadillac Fleetwood 10.4       8   472.0 205  2.93   5.250 17.98  0   0     3        4
Lincoln Continental 10.4      8   460.0 215   3.00  5.424 17.82  0   0     3        4
Camaro Z28             13.3      8   350.0 245   3.73  3.840 15.41  0   0     3     4
...
> mtcars[order(mpg,decreasing=TRUE),]            # best mpg first
                         mpg  cyl
   disp    hp    drat       wt    qsec    vs  am   gear   carb
Toyota Corolla 33.9    4     71.1    65    4.22  1.835   19.90   1     1     4        1
Fiat 128           32.4     4     78.7    66    4.08  2.200   19.47   1     1     4         1
Honda Civic    30.4     4     75.7    52     4.93 1.615    18.52   1     1     4        2
> rownames(mtcars[order(mpg, decreasing = TRUE), ])       # only names
[1] "Toyota Corolla"     "Fiat 128"             "Honda Civic"
[4] "Lotus Europa"        "Fiat X1-9"           "Porsche 914-2"
[7] "Merc 240D"           "Datsun 710"         "Merc 230"
[10] "Toyota Corona"    "Hornet 4 Drive"   "Volvo 142E"
[13] "Mazda RX4"        "Mazda RX4 Wag" "Ferrari Dino"
[16] "Merc 280"            "Pontiac Firebird"   "Hornet Sportabout"
[19] "Valiant"               "Merc 280C"         "Merc 450SL"
[22] "Merc 450SE"       "Ford Pantera L"    "Dodge Challenger"
[25] "Merc 450SLC"     "AMC Javelin"      "Maserati Bora"
[28] "Chrysler Imperial""Duster 360"          "Camaro Z28"
[31] "Cadillac Fleetwood" "Lincoln Continental"
> mtcars[order(cyl,hp), ]                                     # sort by cylinders then horsepower
การเข้าถึงข้อมูลภายใน list    การเข้าถึงข้อมูลที่จัดเก็บอยู่ในรูปของ list ทำได้หลายวิธีดังนี้
           
1.ใช้ [[ ]] ในการเข้าถึงสมาชิกแต่ละตัวใน list ดังนี้ lst[[position]] สำหรับตำแหน่งที่ระบุนั้นอาจเป็น
หมายเลข หรือชื่อก็ได้ เช่น
> lst = list(a=1:2,b=letters[1:3],c=FALSE)
> lst[[1]]

[1] 1 2
> lst[["a"]]
[1] 1 2
            2.ใช้$ เข้าถึงข้อมูลใน list จะสะดวกกว่าการใช้ lst[["varname"]]
> lst = list(one.to.two = 1:2, "a-e" = letters[1:5])
> lst$one.to.two                                                               # access with $
[1] 1 2
> lst$o
                                                                                   # unique shortening
[1] 1 2
> lst$a-e
                                                                               # needs quotes to work
Error: Object "e" not found
> lst$"a-e"
[1] "a" "b" "c" "d"
 "e"
               
3.ใช้สัญลักษณ์ของเวกเตอร์ [] กับ list เหมือนกับที่ใช้กับเวกเตอร์
> lst = list(a=1:2,b=letters[1:2],c=FALSE)
> lst[1]                                                              # return a list with just the first component
$a
[1] 1 2
> lst[[1]]                                                            # first component has no name
[1] 1 2
            4.2.3 การกำหนดค่าใน Data Frame หรือ List
            ในการกำหนดค่า หรือเปลี่ยนค่าข้อมูลใน data frame นั้นต้องทำโดยตรงกับ data frame นั้น ไม่สามารถใช้กับการattach data frame ได้ (เนื่องจาก attach จะ copy เวกเตอร์ข้อมูลมา ดังนั้นการเปลี่ยนค่าข้อมูลจะเปลี่ยนเฉพาะในตัวcopy แต่ไม่มีการเปลี่ยนแปลงที่ตัว data frame) เราสามารกำหนดหรือเปลี่ยนค่าข้อมูลใน data frame หรือ list ได้ในทำนองเดียวกับการสร้างเวกเตอร์ข้อมู ลนั่นเอง
df[rows,cols] = values,
lst$name = value, or
lst$name[i] = value
> df = data.frame(a=1:2,b=3:4)                            # with names
> df[1,1] = 5                                                      # first row, first column
> df[,2]=9:10                                                     # all rows, second column
> df[1:2,3:4] = cbind(11:12, 13:14)                      # rows and columns at once
> df                                                                  # new columns added
    
a   b  V3  V4
1   5  9   11   13
2   2 10  12   14
> df[1:2, 10:11] = cbind(11:12,13:14)
                   # would create a hole
Error in "[<-.data.frame"(‘*tmp*‘, 1:2, 10:11, value = c(11, 12, 13, 14 :

new columns would leave holes after existing columns
> df[,2:3] = 0                                                     # recycling occurs
> df
           
a   b  V3  V4
     
1    5   0   0    13
     
2    2   0   0    1 4
            เราสามารถใช้
$ กับ list ในการอ้างถึงเวกเตอร์ข้อมูลทั้งเวกเตอร์หรือสมาชิกในบางตำแหน่งก็ได้
> lst = list(a = 1:2, b=1:4,c = c("A", "B", "C"))
> lst$a
[1] 1 2
> lst$b[3] = 16
> lst$c[4]
[1] NA
> lst$c[4]="D"
> lst
$a
[1] 1 2
$b
[1] 1 2 16 4
$c
[1] "A" "B" "C" "D"
            เราสามารถใช้ฟังก์ชัน c() ในการรวม list เข้าด้วยกันโดยใช้ top-level components หรือใช้กับ data frame ที่มีจำนวนแถวเท่ากันก็ได้ แต่ผลที่ได้จะเป็ น list ไม่ใช่ data frame ถ้าต้องการให้ข้อมูลเปลี่ยนเป็ น data frame ทำได้โดยใช้ฟังก์ชัน data.frame()
            4.2.4 การใช้ฟังก์ชันต่างๆกับ data frame หรือ list
            เราสามารถใช้คำสั่ง apply( ) ในการใช้ฟังก์ชันกับแถวหรือคอลัมน์ของเมตริกซ์หรือ data frame ก็ได้ เนื่องจาก dataframe ก็เสมือนเป็ นเมตริกซ์นั่นเอง ถึงแม้ใน R จะมีฟังก์ชันสำเร็จรูปที่เราสามารถเรียกใช้ได้โดยตรง แต่บางครั้งเราจำเป็ นต้องใช้ฟังก์ชัน apply( ) ช่วย เช่น หาก data frame หนึ่งประกอบด้วยตัวเองเท่านั้น เมื่อเราใช้ฟังก์ชัน mean( )จะได้ผลลัพธ์เป็ นค่าเฉลี่ยของแต่ละตัวแปร ในขณะที่ถ้าใช้ median( ) จะได้ผลลัพธ์เป็ นค่ามัธยฐานของข้อมูลทั้ง dataframe เราจะแสดงให้เห็นดังตัวอย่างต่อไปนี้
> df = ewr[, 3:10]                                               # make a data frame of the times
> mean(df)                                                        # mean is as desired
AA            CO            DL           HP           NW         TW          UA           US
17.83478   20.01957  16.63043 19.60435 15.79783 16.28043 17.69130  15.49348
> median(df)                                                      # median is not as desired
Error in median.default(df) : need numeric data
> apply(df,2,median)                                          # median of columns
AA     CO     DL     HP     NW     TW     UA     US
16.05 18.15 15.50  18.95 14.55  15.65  16.45  14.45
เราสามารถใช้ฟังก์ชันกับ list ได้เช่นเดียวกับการใช้กับเมตริกซ์ โดยการใช้ lapply( ) หรือฟ้งก์ชันที่ใช้งานง่ายกว่าคือ sapply( ) โดยที่ทั้งสองคำสั่งนี้จะใช้ฟังก์ชันที่เราเลือกกับองค์ประกอบระดับสูงสุดของ list หรือกับทั้งเวกเตอร์คำสั่ง lapply( ) จะให้ผลลัพธ์เป็ list ในขณะที่ คำสั่ง sapply( ) จะให้ผลลัพธ์เป็ นเวกเตอร์หรือเมตริกซ์แล้วแต่ ละความเหมาะสม
            ตัวอย่างต่อไปนี้แสดงวิธีการหาค่ามัธยฐานของแต่ละตัวแปรของตัวอย่างข้างต้น และเนื่องจาก
data frame คือ list  จึงได้เป็น
> sapply(df,median)                                            # use sapply to find the median for each variable
AA    CO   DL   HP   NW    TW   UA
US16.05 18.15 15.50 18.95 14.55 15.65 16.45 14.45
> lapply(df,median)                                            # use lapply to find the median for each variable, the result
returned as a list
$AA
[1] 16.05
$CO
[1] 18.15
$DL
[1] 15.5
$HP
[1] 18.95
$NW
[1] 14.55
$TW
[1] 15.65
$UA
[1] 16.45
$US
[1] 14.45

4.3 การใช Model formula กับข้อมูลหลายตัวแปร
           
สัญลักษณ์ของ model formula คือ () ที่ R ใช้ในการแสดงความสัมพันธ์ระหว่างตัวแปรในรูปของตัวแบบ ซึ่งเป็ นสัญลักษณ์ที่ มีความยืดหยุ่นนมาก และใช้ได้ในหลายวัตถุ ประสงค์ ตัวอยางต่ อไปนี้เป็ นการใช้ model formula ในการสรางboxplot ของตัวแปร weight แยกตามกลุ่ม
> data(PlantGrowth)
> attach(PlantGrowth)
> boxplot(weight ~ group)
ได
กราฟดังรูปที่ 4.8
            ในกรณีที่มีสองตัวแปรนั้นการใช้
model formula นั้นค่อนข้างง่าย โดยจะกำหนดให้ตัวแปรตามอยู่ทางด้านซ้ายของ() และให้ตัวแปรอิสระหรือ factor อยู่ทางด้านขวาของ () ดังนี้
response predictor
            ในกรณีที่ข้อมูลของเรามากกว่าสองตัวแปร การใช้
model formula จะค่อนข้างยุ่งยากมากขึ้น ต่อไปนี้
เป็ นการใช้
model formula ในรูปแบบต่างๆกันหากเรามีตัวแปรอยู่


รูปที่ 4.8: Boxplot of weight for groups
           
ความหมายที่แท้จริงของคำว่า model by นั้นขึ้นอยู่กับการใช้งานฟังก์ชันนี้ ในกรณีของ boxplot นั้นฟังก์ชันนี้จะมีความแตกต่างจากเมื่อใช้กับฟังก์ชัน lm นอกจากนั้นจะเห็นได้ว่าเครื่องหมายทางคณิตศาสตร์ยังคงสามารถใช้ได้ในฟังก์ชันนี้ แต่ต้องใช้ภายในฟังก์ชัน I( ) เท่านั้น
           
4.3.1 การสร้าง boxplots จาก model formula
            เราสามารถใช้ model formula ในการสร้าง boxplot สำหรับตัวหนึ่งโดยแยกตามระดับหรือกลุ่มของอีกตัวหนึ่งได้ เช่นจากตัวอย่างที่ผ่านสำหรับข้อมูลชุด babies (UsingR) เราจะใช้ model formula ในการสร้าง boxplot สำหรับตัวแปรgestation แยกตามระดับรายได้ต่อปี ของครอบครัว, inc ได้ดังตัวอย่างต่อไปนี้ ซึ่งในตัวอย่างนี้เราได้ใช้คำสั่ง boxplot3 ครั้ง กราฟที่ไดจากแต่ละคำสั่งแสดงดังรูปที่ 4.9 สำหรับคำสั่งที่สามได้ใช้ argument varwidth = TRUE ซึ่งเป็ นการกำหนดให้ความกว้างของตัวกลองแสดงขนาดของตัวอย่าง นั่นคือถากลุ่มใดมีขนาดตัวอย่างมาก กลองก็จะมีขนาดกว้างตามไปด้วย
> boxplot(gestation ~ inc, data = babies)
> boxplot(gestation ~ inc, subset = gestation != 999 & inc != 98, data = babies)
> boxplot(gestation ~ inc, subset = gestation != 999 & inc != 98, data = babies,
+ varwidth = TRUE, xlab = "income level", ylab = "gestation (days)")


รูปที่
4.9: Boxplot of gestation times for income levels
            4.3.2 การใช้ฟังก์ชัน plot( ) กับ model formula
            เนื่องจากเราสามารถใช้ฟังก์ชัน plot( ) ในการสร้างกราฟได้หลายรูปแบบ (ขึ้นอยู่กับ agument ที่กำหนด) เราสามารถใช้ฟังก์ชัน plot( ) ร่วมกับ model formula ได้ เช่น ถ้า x และ y เป็ นเวกเตอร์ข้อมูลที่เป็ นตัวเลข และเป็ นคู่กันแล้วmodel formula y x ได้จากตัวแบบyi= β0+ β1xi+ εi นั่นเอง ซึ่งกราฟที่ใช้ในการพิจารณาตัวแบบชนิดนี้คือscatterplot ซึ่ง model formula นี้อยูในรูปแบบของ numeric numeric  เนื่องจากตัวแปร x และ y เปนตัวแปรเชิงปริมาณทั้งคู่
            ในกรณีที่
model formula เป็นแบบ numeric factor นั้นตัวแบบจะอยูในรูปของ yij= µi+ εij ซึ่งเป็นลักษณะของตัวแบบของค่าสังเกตที่ได้จากการวางแผนการทดลอง สำหรับตัวแบบลักษณะนี้กราฟที่เหมาะสมในการพิจารณาลักษณะของข้อมูลคือ boxplot ซึ่งในกรณีที่ y เป็ นตัวแปรเชิงปริมาณ และ f เป็ น factor ที่บ่งชี้ว่า y อยูในกลุ่มใดนั้นคำสั่ง plot(y f ) จะเป็ นการสร้าง boxplot ของ y แยกตามกลุ่มของ f เช่น
> plot(gestation ~ factor(inc), data=babies, varwidth = TRUE, subset = gestation != 999
+ & inc !=98, xlab="income level", ylab = "gestation (days)")
            ซึ่งจะได้กราฟรูปเดียวกับรูปที่
4.9  รูปที่ 3 โดยที่ฟังก์ชัน factor( ) เป็นการทำใหตัว inc เปลี่ยนจากเวกเตอร์ตัวเลข เป็น factor  นอกจากที่เราสามารถใช้ model formula ร่วมกับฟังก์ชัน plot( ) แล้วเรายังสามารถใช้ร่วมกับฟังก์ชัน pairs( ) ได้อีกด้วย เช่นเราสามารถสร้างกราฟดังรูปที่ 4.6 ได้ดังนี้
> pairs(~ gestation + age + wt + inc, data=babies, subset = gestation != 999 & age != 99
+ & inc !=98)
            4.3.3 การสร้าง Contingency Tables ด้วยฟังก์ชัน xtabs( )
            ที่ผ่านมาเราได้เห็นการสร้าง three-way contingency table โดยใช้คำสั่ง table( ) เมื่อข้อมูลที่มีเป็ นข้อมูลดิบ ถ้าหากข้อมูลที่มีอยู่ เป็ นข้อมูลที่ มีการแจงนับแลว และเราต้องการป้ อนข้อมู ลนี้ลงในตาราง 3 ทาง สามารถทำไดโดยใช้ฟังก์ชันxtabs( ) ซึ่งฟังก์ชันนี้สามารถทำงานร่วมกับ model formula และเป็ นทางเลือกหนึ่งของการใช้ table() 
            ฟังกชัน
as.data.frame() จะให้ผลที่ตรงกันข้ามกับที่ฟังก์ชัน xtabs() และ xtabs() โดยจะสร้าง data frame ที่ประกอบดวยการรวมกันของระดับของตัวแปรและจำนวนนับที่ เปนไปได้ทั้งหมดเมื่ อมีการเรียกตารางนี้
ตัวอย
างที่ 4.7
           
ในตารางที่ 4.2 เป็ นตาราง 3 ทางที่แสดงเปอร์เซ็นต์ของการใช้ seat-belt ใน 2 ปี จำแนกตามชนิดของ
กฏหมายที่บังคับใช้
และชนิดของรถยนต์
ตารางที่
4.2: Seat-belt data cy type of law and vehicle
            เราจะสร้างตาราง 4.2 ใหม่โดยใช้ R โดยในขั้นแรกเราจะเปลี่ยนตารางข้อมูลนี้ให้เป็ น data frame โดยการสร้างตัวแปรที่เหมาะสม แล้วใส่เปอร์เซ็นต์ลงในคอลัมน์ต่อคอลัมน์  จากนั้นสร้างตัวแปรสำหรับ car, year, enforcement ที่มีค่าสอดคล้องกับเปอร์เซ็นต์ โดยใช้ฟังก์ชัน rep( ) ช่วย
> percents = c(71,70,79,82,71,83,71,50,70,71,55,73)
> car = rep(c("passenger", "pickup", "van/SUV"), 4)
> year = rep(rep(2001:2002, c(3,3)), 2)
> enforcement = rep(c("primary", "secondary"), c(6,6))
> seatbelts = data.frame(percents, car, year, enforcement)

> seatbelts
      
percents                  car   year    enforcement
1             71       passenger    2001     primary
2             70       pickup        2001      primary
3           79      van/SUV     2001      primary
4             82       passenger   2002      primary
5             71       pickup        2002      primary
6            83      van/SUV     2002     primary
7             71       passenger    2001     secondary
8             50       pickup         2001     secondary
9             70      van/SUV      2001    secondary
10           71      passenger     2002    secondary
11           55      pickup          2002    secondary
12           73      van/SUV       2002   secondary
            ผลที่ได้คือ data frame ที่ประกอบด้วย 4 ตัวแปร จากนั้นจะใช้ฟังก์ชัน xtabs() สร้างตารางสามทางโดยใช้สมการความสัมพันธ์เข้ามาช่วย ดังนี้
> tab = xtabs(percents ~ car + year + enforcement, data = seatbelts)
> tab

, , enforcement = primary
                      
year
car          2001    2002
passenger  71      82
pickup       70      71
van/SUV   79      83
, , enforcement = secondary
                     
year
car             2001   2002
passenger      71       71
pickup           50       55
van/SUV       70       73
            สุดท้ายจะใช้ฟังก์ชัน ftable() ในการปรับตารางให้อยู่ในตารางเดียวกันทั้งหมด
> ftable(tab, col.vars= c("enforcement", "year"))
                                        
enforcement primary         secondary
                        
year           2001   2002                2001   2002
car     
passenger                             71       82                    71      71
pickup                                  70       71                    50      55
van/SUV                              79       83                    70      73
            4.3.4 การใช้ฟงก์ชัน split( ) และ stack
            ในบางครั้ง model formula ไม่สามารถใช้ได้กับฟังก์ชันบางฟังก์ชัน เราสามารถใช้ฟังก์ชัน split( ) ในการแบ่งตัวแปรหนึ่งตามระดับของ factor ได้ เช่น ถ้า y คือตัวแปรที่มีค่าเป็ นตัวเลข และ f เป็ factor แล้วเราสามารถใช้ split(x,f)ซึ่งผลลัพธ์ที่ได้จะเป็ list ขององค์ประกอบระดับสูงสุดที่มีค่าของ y ที่สอดคล้องกับระดับของ f เช่น คำสั่ง box-plot(split(x,f)) จะสร้างกราฟรูปเดียวกับที่ได้จากคำสั่ง boxplot(x y)   การใช้ฟังก์ชันใดฟังก์ชันหนึ่งกับแต่ละส่วนของ list ที่ได้จากการใช้ split( ) สามารถทำได้โดยใช้อีกฟังก์ชันหนึ่งคือ tapply( ) ซึ่งมีรูปแบบคือ      tapply(x, f, function)  ซึ่งฟังก์ชันสามารถเป็ นได้ทั้งชื่ อของฟังก์ชัน เช่ น mean หรือการกำหนดโดยตัวเราเองก็ได้ 
            ฟังก์ชันที่ตรงข้ามกับ
split( ) คือฟังก์ชัน stack( ) ซึ่งเป็นฟังก์ชันที่ใช้เพื่อรวบรวมตัวแปรต่างๆไปเก็บไว้ในรูปของdata frame หรือ list และแบ่งเป็นสองตัวแปร โดยที่ตัวแปรหนึ่งประกอบดวยค่าของตัวแปรนั้น และอีกตัวแปรหนึ่งเป็ นตัวชี้ให้เห็นว่าข้อมูลนี้มาจากตัวแปรเดิมตัวแปรใด ส่วนฟังกชัน unstack( ) จะตรงข้ามกับฟังก์ชัน stack( ) และจะคล้ายกับฟังก์ชัน split( ) เว้นแต่ว่าจะพยายามให้ผลลัพธ์เป็ น data frame ถ้าเป็ นไปได้
ตัวอย่างที่
4.8
           
ข้อมูลชุด cancer(UsingR ประกอบด้วย survival time สำหรับมะเร็งแต่ละชนิด ข้อมูลเก็บอยู่ในรูป
ของ
list เนื่องจากข้อมูลของแต่ละตัวแปรมีจำนวนไม่เท่ากัน เราสามารถสร้างข้อมูลที่สามารถทำงานร่วมกับ model formula ได้ โดยการใช้ stack( ) ดังนี้
> library(UsingR)
> cancer
$stomach
[1]   124  42  25  45  412  51  1112  46  103  876  146  340  396
$bronchus
[1]   81  461 20  450  246  166  63  64  155  859  151  166  37  223  138  72  245
$colon
[1]  248  377  189  1843  180  537  519  455  406  365  942  776  372  163  101  20  283
$ovary
[1]   1234  89  201  356  2970  456
$breast
[1]   1235  24  1581  1166  40  727  3808  791  1804  3460  719
> stack(cancer)
       
values          ind
1          124        stomach
2          42         stomach
3          25         stomach
4          45         stomach
...
63         3460     breast
64         719       breast
            ชื่อตัวแปรในผลลัพธ์ของ
stack( ) จะเป็ น values ที่เก็บข้อมูล และ ind เพื่อชี้ว่าข้อมูลนี้มาจากแปรใด ในการใช้ stack( ) นั้นเราต้องจำไว้เสมอว่าตัวแปรทุกตัวใน data frame หรือ list ต้องมีชื่อเสมอ ind จึงจะชี้ถึงที่มาของข้อมูลได้ว่ ามาจากตัวแปรเดิมตัวแปรใด
4.4 Lattice Graphics
           
สำหรับข้อมูลหลายตัวแปรนั้น เรามีวิธีการสร้างกราฟที่แสดงความสัมพันธ์ระหว่างตัวแปร 2 ตัว โดยมีเงื่อนไขตามตัวแปรตัวที่สามได้อีกรูปแบบหนึ่ง เรียกว่า Lattice Graphics ซึ่งอยู่ใน package ชื่อ lattice
หลักการพื้นฐานของกราฟแบบนี้คือ กราฟจะประกอบด้วยกราฟย่อยๆหลายรูป แต่ละรูปจะสอดคล้องกับค่า
บางค่า ของตัวแปรที่เป็
นเงื่อนไข การเรียกใช้ฟังก์ชันการสร้างกราฟ lattice ทำได้โดยการใช้ model formula ดังนี้    
response predictor | condition
            สำหรับตัวแปร response จะมีหรือไม่มีก็ได้ เช่น ถ้าเราสร้างกราฟตัวแปรเดียว (ฮิสโตแกรม) ก็ไม่ต้อง

กำหนดตัวแปรนี้ แต่ถ้าเราสร้าง
scatterplot สำหรับตัวแปร 2 ตัว ก็จำเป็ นต้องมีตัวแปร response สำหรับตัวแปร condition อาจเป็ นปัจจัยหรือเป็ นค่ าตัวเลขก็ได้ ถ้าเป็ นปัจจัยกราฟย่ อยแต่ ละรูปจะสอดคล้องกับแต่ ละระดับของปัจจัยนี้ แต่ถ้าเป็ นค่าตัวเลขโปรแกรมจะแบ่งค่าตัวเลขเหล่านี้ออกเป็ นช่วงๆ และสร้างกราฟย่อยที่สอดคล้องกับช่วงเหล่านี้ แต่ละกราฟย่อยในกราฟ lattice จะมีสเกลเดียวกันทั้งหมดทั้งตามแกนx และแกนy ทำให้ง่ายต่อการเปรียบเทียบกราฟย่อยเหล่านี้
            การใช้ฟังก์ชันนี้จะเริ่มด้วยการเรียก
lattice package และเปลี่ยนสีพื้นของกราฟเป็ นสีขาว เพื่อให้เห็นกราฟได้ชัดเจนมากขึ้น
> library(lattice)
> trellis.device(bg = "white")
            การเปลี่ยนสีพื้นของกราฟ
lattice สามารถทำได้อีกแบบหนึ่งคือใช้ options()
> options(littice.theme = "col.whitebg")
            ต่อไปนี้เป็
นตัวอย่ างการสร้างกราฟแบบต่ างๆโดยใช้แพคเกจ lattice Histogramsฮิสโตแกรมเปนกราฟสำหรับข้อมูลตัวแปรเดียว ตัวอย่างต่อไปนี้แสดงคำสั่งสำหรับการสร้างฮิสโตแกรม  ของน้ำหนักแรกเกิด (wt) สำหรับระดับต่างๆของปัจจัย smoke
> library(UsingR)
> histogram( ~ wt | factor(smoke), data = babies,
+ subset = wt != 999, type = "density")
            ได้กราฟดังรูปที่
4.10 โดยที่ argument type = "density" ทำให้พื้นที่ของฮิสโตแกรมรวมกันเป็ นหนึ่ง ซึ่งให้ผลเหมือน กับ argument prob=TRUE ในฟังก์ชัน hist()

รูปที่
4.10: Histogram of birth weight by smoking status
Densityplots กราฟการแจกแจงความหนาแน่ นนั้นเป็ นทางเลือกหนึ่ งที่ สามารถใช้แทนฮิสโตแกรมได้ เราสามารถสร้างกราฟการแจกแจงความหนาแน่นได้โดยใช้ฟังก์ชัน densityplot() ดังนี้
> densityplot( ~ wt | factor(smoke), data = babies)
ได้กราฟดังรูปที่
4.11

รูปที่
4.11: Densityplot of birth weight by smoking status
BoxplotsBoxplot นั้นสามารถใช้ได้กับข้อมูลตัวแปรเดียวหรือหลายตัวแปร เช่ นเราต้องการศึกษาความสัมพันธ์ระหว่ าง ระยะเวลาของการตั้งครรภ์ และรายได้ จำแนกตามปัจจัย smoke สามารถสร้าง boxplot ได้ดังนี้
> bwplot(gestation ~ factor(inc) | factor(smoke),
+ data=babies, subset = gestation != 999)
ได้ดังรูปที่
4.12

รูปที่
4.12: Boxplots of gestation time versus income level by smoking status
Scatterplots
> panel.regression = function(x,y) {
+ panel.xyplot(x,y)
+ panel.abline(lm(y ~ x))
+ }
> xyplot(wt ~ gestation | factor(smoke), data=babies,
+ subset = (wt != 999 & gestation != 999),
+ panel = panel.regression)

            ได้กราฟดังรูปที่
4.13 ฟังก์ชัน panel.regression(x,y) สร้างโดยผู้ใช้เองเพื่อเพิ่มเส้นถดถอยเข้าไปใน
scatterplot

รูปที่
4.13: Scatterplot of gestation time versus weight for levels of smoke










ไม่มีความคิดเห็น:

แสดงความคิดเห็น