list

  • vector 是 R 裡面最「簡單」的資料結構。有時候我們需要比較更複雜的資料結構處理我們遇到的資料,例如,我們或許需要儲存不同資料類型或是具有階層結構的資料。面對這兩種需求,vector 無能為力,因此需要用到 R 的 list。

  • R 可以透過 list() 去製造出 list。list() 的使用方式很類似用來製造 vector 的 c(),但與 c() 不同的是,list()
    1. 能使用不同的資料類型
    2. 具有階層結構,亦即,list() 裡面可以放入另一個 list()
    #> [[1]]
    #> [1] TRUE
    #> 
    #> [[2]]
    #> [1] 1 2 3
    #> 
    #> [[3]]
    #> [1] "Hello"
    #> $kai
    #> [1] TRUE
    #> 
    #> $joy
    #> [1] 1 2 3
    #> 
    #> $jess
    #> [1] "Hello"
    #> [[1]]
    #> [1] 1.1
    #> 
    #> [[2]]
    #> [[2]][[1]]
    #> [1] 2.1
    #> 
    #> [[2]][[2]]
    #> [1] "Hello"

Subsetting

  • 通常我們會習慣為 list 加上名字 (names),幫助我們更容易處理這種比較複雜的資料結構

  • []: 與 vector 一樣,我們可以透過 lst[<char vector of names>]lst[<integer vector>]lst[<logical vector>] 去 subset list

    #> $single
    #> [1] FALSE
    #> $single
    #> [1] FALSE
    #> 
    #> $tags
    #> [1] "ig"     "selfie"
    #> $age
    #> [1] 20
    #> 
    #> $tags
    #> [1] "ig"     "selfie"
  • 就像 vec[<some vector>] 會回傳一部分的 vector (sub-vector)lst[<some vector>] 也會回傳一部分的 list (sub-list)。換言之,使用 [] 時,回傳值的資料結構不會改變

  • 我們可以將 list 想像成一列火車,每節車廂是一個長度為 1 的 sub-list,車廂裡面是這個 sub-list 儲存的值。欲取得 sub-list,使用的是 [];欲取得 sub-list 裡面的值 (i.e. 脫去外層的 list),需使用 [[]]

    #> [1] "list"
    #> $tags
    #> [1] "ig"     "selfie"
    #> 
    #> [1] "character"
    #> [1] "ig"     "selfie"
    • lst[["<name>"]] 有另一種更簡便的寫法:lst$<name>, e.g. ben[["tags"]] 可改寫成 ben$tags