20150920 [Coursera] R Programming (5)

整理自 R Programming (Week 1) -- Subsetting Data

[ Week 1 課程內容 ]
 
 
[ 本次筆記內容 ] Subsetting Data
  • (一)Subsetting - Basics
  • (二)Subsetting - Lists
  • (三)Subsetting - Matrices
  • (四)Subsetting - Partial Matching
  • (五)Subsetting - Removing Missing Values
 
 
[ 背景知識 ] 基本運算元
  • 有一些基本運算元可以提取 R 物件裡的內容 : 
  • 單個中括號 : [ ... ]
  • 其回傳值為與原向量相同類別的物件,可以回傳數個以上的元素。(有例外)
  • [ 例如 ] 提取
  • 雙個中括號 : [[ ... ]]
  • 用來提取 "列表" (list) "資料框" (data frame)
  • 只能回傳單一元素且其回傳值不是"列表" (list) "資料框" (data frame)。
  • 金額符號 : $ 
  • 藉由 "列表" (list) "資料框" (data frame) 的名稱來提取元素。
  • 在意義上跟雙個中括號 [[ ... ]] 很像。
 
 
[ 補充資料 ]
 
 
 
 

(一)Subsetting - Basics

[ 參考資料 ]
 
[ 重點整理 ] 基本操作
 
> x <- c("a", "b", "c", "c", "d", "a")    # 建立一個數值向量x
> x[1]    # 取得x向量裡的第"1"個元素
[1] "a"
 
> x[2]    # 取得x向量裡的第"2"個元素
[1] "b"
 
> x[1:4]    # 取得x向量裡第"1 ~ 4"個元素
[1] "a" "b" "c" "c"
 
> x[x > "a"]    # 取得x向量裡其他 字母大於"a" 的元素
[1] "b" "c" "c" "d"
 
> u <- x > "a"    # 判斷x向量裡的 字母是否大於"a" ? 並將結果儲存在"u"裡面 (以邏輯形式呈現)
> u
[1] FALSE TRUE TRUE TRUE TRUE FALSE
> x[u]    # 將"u"回傳給"x",其結果會 對應到"x"在"u"為"TRUE" 的元素
[1] "b" "c" "c" "d"
 
 
 
 

(二)Subsetting - Lists

[ 參考資料 ]
 
[ 重點整理 ] 處理列表
(1) 各種運算子的使用方式
 
> x <- list(foo = 1:4, bar = 0.6)    # 建立列表
 
> x[1]    # 使用單括號,會得到包含元素名稱的列表
$foo
[1] 1 2 3 4
 
> x[[1]]    # 使用雙括號,只會得到列表
[1] 1 2 3 4
> x$bar    # 使用金額符號,只會顯示元素
[1] 0.6
> x[["bar"]]    # 使用雙括號,只會顯示元素
[1] 0.6
> x["bar"]    # 使用單括號,會顯示名稱+元素
$bar
[1] 0.6
 
 
 (2) 取得多個元素( 使用"單括號" )
  •  [ ]  我們無法使用"雙括號"及"金額符號"取得多個元素 !
 
> x <- list(foo = 1:4, bar = 0.6, baz = "hello")    # 建立列表
> x[c(1, 3)]    # 想要得到 list 裡面的第"1"個(foo)元素和第"3"個(baz)元素
$foo
[1] 1 2 3 4
 
$baz
[1] "hello"
 
 
(3) "雙括號"與"金額符號"的差異
 
# The [[ operator can be used with computed indices    雙括號可以使用在"需要經過計算"的值(例如:變數)
# $ can only be used with literal names.    金額符號必須要知道確實存在的元素名稱
 
> x <- list(foo = 1:4, bar = 0.6, baz = "hello")
> name <- "foo"
 
> x[[name]]    # 使用雙括號來算出其對應到的元素名稱("name"是變數,在這裡對應到列表裡的"foo")
[1] 1 2 3 4
 
> x$name    # 使用金額符號則會在列表裡搜尋名稱(因為列表裡沒有"name",在這裡會找不到對應的元素)
NULL
> x$foo    # 使用金額符號則會在列表裡搜尋名稱(列表裡有"foo",在這裡找得到其對應的元素)
[1] 1 2 3 4
 
 
(4) 使用整數數列作為參數( 使用"雙括號" )
# The [[ can take an integer sequence.
> x <- list(a = list(10, 12, 14), b = c(3.14, 2.81))    # 建立 x 列表(裡面有a、b列表)
                                                        # a列表相當於x列表的第一個元素、b列表是x列表的第二個元素
 
> x[[c(1, 3)]]    # 使用一個整數數列作為參數,在這裡以向量(1, 3)表示(取得第一個列表裡的第3個元素)
[1] 14
> x[[1]][[3]]    # 使用1和3來取子集(這和使用向量(1, 3)是一樣的)
[1] 14
 
> x[[c(2, 1)]]    # 使用向量(2, 1)來取得x列表內第二個列表裡的第1個元素
[1] 3.14
 
 
 
 

(三)Subsetting - Matrices

[ 參考資料 ]
 
[ 重點整理 ] 處理矩陣
(1) 矩陣的建立
# matrix(元素的數量, 列的數量, 直行的數量)
> x <- matrix(1:6, 2, 3)    # 建立一個元素有 1 ~ 6 的矩陣
> x
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6
 
 
> x[1, 2]    # 取得矩陣裡"第1列,第2行"的元素
[1] 3
 
> x[2, 1]    # 取得矩陣裡"第2列,第1行"的元素
[1] 2
 
 
# Indices can also be missing.
> x[1, ]    # 取得矩陣裡"第1列"的所有元素
[1] 1 3 5
 
> x[, 2]    # 取得矩陣裡"第2行"的所有元素
[1] 3 4
 
 
(2) 矩陣的特性
  • 在預設情況下,當矩陣裡的某一個欄位留白 ( 例如 : x[,2] 或 x[2,] ),會得到一個長度為 1 的向量來取代 1 x 1 的矩陣。我們可以設定參數 "drop = FALSE" 來避免這種情形產生。
  • 先建立矩陣
> x <- matrix(1:6, 2, 3)
> x
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6
>
  • < 情況 1 > : 處理單一元素 (以矩陣形式呈現)
> # 取得矩陣裡"第1列,第2行"的元素
> x[1, 2]
[1] 3
> class(x[1, 2])    # 矩陣裡"第1列,第2行"的元素類別,其類別為"整數(integer)"
[1] "integer"
> # 設定參數,讓結果以 1x1 的矩陣形式呈現
> x[1, 2, drop = FALSE]
 [,1]
[1,] 3
 
  • < 情況 2 > : 處理列 or 行 (以矩陣形式呈現)
> # 取得矩陣裡"第1列"的類別
> x[1,]
[1] 1 3 5
> class(x[1,])    # 矩陣裡"第1列"的類別,其類別正常推斷應為"矩陣(matrix)",但是結果卻為"整數(integer)"
[1] "integer"
> # 設定參數,讓結果以 1x1 的矩陣形式呈現
> x[1, , drop = FALSE]
     [,1] [,2] [,3]
[1,]    1    3    5
 
 
 
 
[ 參考資料 ]
 
[ 重點整理 ] 利用部份匹配來尋找完整字詞
# 建立列表,在這裡的列表名稱為"aardvark"
> x <- list(aardvark = 1:5)
>
# 因為每一次要呼叫列表時都要打"aardvark"有點麻煩,所以我們可以用以下方法來增加效率: 
(1) 使用金額符號
# 使用金額符號
> x$a
[1] 1 2 3 4 5
# 因為列表"aardvark"裡面有字母"a",所以可以間接匹配得到結果
 
(2) 使用雙括號( 加上參數"exact = FALSE" )
# 使用雙括號
> x[["a"]]
NULL
 
> x[["a", exact = FALSE]]
[1] 1 2 3 4 5
# 使用"exact = FALSE"來間接匹配得到結果
 
 
 
 
[ 參考資料 ]
 
[ 重點整理 ] 移除遺失值
< 方法 1 > 使用 is.na()
  • 回傳含有遺失值的邏輯型向量,適用於只存在一個向量存在的情況
 
> x <- c(1, 2, NA, 4, NA, 5)
> bad <- is.na(x)    # is.na()會以"TRUE or FALSE"的型式回傳含有"NA"的值(若為"NA",則回傳"TRUE")
> x[!bad]    #  使用"!"將結果反相,讓x顯示"非NA"的元素
[1] 1 2 4 5
 
 
< 方法 2 > 使用 complete.cases()
  • 回傳沒有遺失值的邏輯型向量,適用於同時存在多個向量且含有遺失值的情況
 
# 以兩個含有"NA"的向量為例
> x <- c(1, 2, NA, 4, NA, 5)
> y <- c("a", "b", NA, "d", NA, "f")
>
> good <- complete.cases(x, y)    
> good
[1] TRUE TRUE FALSE TRUE FALSE TRUE
> x[good]
[1] 1 2 4 5
> y[good]
[1] "a" "b" "d" "f"
>
>
> # 以一筆含有"NA"的資料表為例
> airquality[1:6, ]    
 Ozone Solar.R Wind Temp Month Day
1 41 190 7.4 67 5 1
2 36 118 8.0 72 5 2
3 12 149 12.6 74 5 3
4 18 313 11.5 62 5 4
5 NA NA 14.3 56 5 5
6 28 NA 14.9 66 5 6
> # 這個資料表含有三個"NA"
>
> good <- complete.cases(airquality)
>
> airquality[good, ][1:6, ]
 Ozone Solar.R Wind Temp Month Day
1 41 190 7.4 67 5 1
2 36 118 8.0 72 5 2
3 12 149 12.6 74 5 3
4 18 313 11.5 62 5 4
7 23 299 8.6 65 5 7
> # 資料表裡的"NA"被移除了