[R]常用的向量類別與資料存取方式之整理

本文是擷取其他網路上R的向量相關的method及使用方式,包含:

  • 因子方法
  • 資料框架
  • 集合

所有範例的測試程式:

#參考網址:https://blog.gtwang.org/r/r-strings-and-factors/4/

#產生字串元素陣列
members = c("Andy","Ace","Ting","Ting","Max","Jimmy")
#轉換成因子以後,預設會按照字母大小排列,並且只顯示不重複因子(level)
members.factor = factor(members)
#加入factor的第二個參數,進行指定陣列排序給Levels屬性
members.factorWithOrder = factor(members, levels = c("Ting", "Ace", "Jimmy", "Andy"))
#加入factor的第三個參數,給予類別名稱(Levesls屬性的值會被Labels給替代掉)
members.jobTitle = factor(members, levels = c("Ting", "Ace", "Jimmy", "Andy"), labels = c("PG","SA","PG","PM"))

#使用data.frame做轉因子處理
frame <- data.frame(
    jobTitle_ = c("SA","PM", "PG", "PG" , "PG"),
    membersName_ = levels(members.factor) 
)

#陣列中加入新的元素(尾部)
members_add_bottom <- c(levels(members.factor), "Kirk")
#陣列中加入新的元素(頭部)
members_add_head <- c("Joy", members_add_bottom)

#使用list存取,參考網址:https://blog.csdn.net/sinat_26917383/article/details/51123214
members_list <- list(memberName="Ting" , jobTitle = "PG")

#使用Vector進行動態集合存取,參考網址:https://stackoverflow.com/questions/26508519/how-to-add-elements-to-a-list-in-r-loop
members_vector <- vector("list",3)  #設定有三個元素(初始化),會轉變成list型態,用 is.atomic()會變成false
members_vector[1] <- "Ting"
members_vector[2] <- "Ace"
members_vector[3] <- "Jimmy"
members_vector[4] <- "Max"  #可以超過原本定義的數量
  

#########################列印區#########################
members #列出所有陣列元素
length(members) #陣列數量
unique(members) #顯示所有的唯一元素(分大小寫不重複)
members.factor  ##列出所有因子類別
levels(members.factor)  #列出Levels屬性裡的元素
nlevels(members.factor) #因子總和數
relevel(members.factor , "Max")  #重新指定levels屬性的排序結果,把Max排在第一
members.factorWithOrder  #顯示排序結果
members.jobTitle    #顯示給予類別名稱後的結果
frame  #顯示data.frame的結果

c(members.factor)  #轉成元素索引編號

members_add_bottom #陣列結尾加入元素
members_add_head  #陣列開頭加入元素
members_list #顯示List物件結果
members_list$memberName #顯示List物件下的元素名稱值
members_list$jobTitle #顯示List物件下的元素名稱值

members_vector   #輸出向量值
is.vector(members_vector)  #是否為向量型態(布林值回傳)
as.vector(members_vector)  #向量轉向量 結果等同於 members_vector
all.equal(members_vector , as.vector(members_vector)) #使用equals比較兩個向量(布林值回傳)
is.list(members_vector)  #檢查是否為List型態
is.recursive(members_vector)  #檢查是否為recursive物件型態(ex:list 或 function)
is.atomic(members_vector)  #是否為原子向量 參考網址:https://stackoverflow.com/questions/8594814/what-are-the-differences-between-vector-and-list-data-types-in-r

執行結果如下圖:

> #########################列印區#########################
> members #列出所有陣列元素
[1] "Andy"  "Ace"   "Ting"  "Ting"  "Max"   "Jimmy"
> length(members) #陣列數量
[1] 6
> unique(members) #顯示所有的唯一元素(分大小寫不重複)
[1] "Andy"  "Ace"   "Ting"  "Max"   "Jimmy"
> members.factor  ##列出所有因子類別
[1] Andy  Ace   Ting  Ting  Max   Jimmy
Levels: Ace Andy Jimmy Max Ting
> levels(members.factor)  #列出Levels屬性裡的元素
[1] "Ace"   "Andy"  "Jimmy" "Max"   "Ting"
> nlevels(members.factor) #因子總和數
[1] 5
> relevel(members.factor , "Max")  #重新指定levels屬性的排序結果,把Max排在第一
[1] Andy  Ace   Ting  Ting  Max   Jimmy
Levels: Max Ace Andy Jimmy Ting
> members.factorWithOrder  #顯示排序結果
[1] Andy  Ace   Ting  Ting  <NA>  Jimmy
Levels: Ting Ace Jimmy Andy
> members.jobTitle    #顯示給予類別名稱後的結果
[1] PM   SA   PG   PG   <NA> PG
Levels: PG SA PM
> frame  #顯示data.frame的結果
  jobTitle_ membersName_
1        SA          Ace
2        PM         Andy
3        PG        Jimmy
4        PG          Max
5        PG         Ting
>
> c(members.factor)  #轉成元素索引編號
[1] 2 1 5 5 4 3
>
> members_add_bottom #陣列結尾加入元素
[1] "Ace"   "Andy"  "Jimmy" "Max"   "Ting"  "Kirk"
> members_add_head  #陣列開頭加入元素
[1] "Joy"   "Ace"   "Andy"  "Jimmy" "Max"   "Ting"  "Kirk"
> members_list #顯示List物件結果
$memberName
[1] "Ting"

$jobTitle
[1] "PG"

> members_list$memberName #顯示List物件下的元素名稱值
[1] "Ting"
> members_list$jobTitle #顯示List物件下的元素名稱值
[1] "PG"
>
> members_vector   #輸出向量值
[[1]]
[1] "Ting"

[[2]]
[1] "Ace"

[[3]]
[1] "Jimmy"

[[4]]
[1] "Max"

> is.vector(members_vector)  #是否為向量型態(布林值回傳)
[1] TRUE
> as.vector(members_vector)  #向量轉向量 結果等同於 members_vector
[[1]]
[1] "Ting"

[[2]]
[1] "Ace"

[[3]]
[1] "Jimmy"

[[4]]
[1] "Max"

> all.equal(members_vector , as.vector(members_vector)) #使用equals比較兩個向量(布林值回傳)
[1] TRUE
> is.list(members_vector)  #檢查是否為List型態
[1] TRUE
> is.recursive(members_vector)  #檢查是否為recursive物件型態(ex:list 或 function)
[1] TRUE
> is.atomic(members_vector)  #是否為原子向量
[1] FALSE