在上一篇([17]R語言基礎 上篇 - 語言特性和資料形態)提到R的Language Paradigm和R的Data Type。
裡面有提到,R其實是Vector base,換句話說一切都是vector。那vector到底有哪幾種(換句話說就是有哪些Data Structure)?
這篇將對R裡面的1維度Data Structure做介紹。
R的Data Structure
在R裡面的Data Structure基本上可以從兩個面向來看:
- 幾個維度
- 是否整個資料屬於同一個type
如果上面的描述還是看不太懂,那麼往下看就會了解這兩個面向的意思。
vector - 1維並且所有內容要是一樣的type
vector是一切的基礎,像我們之前的3+5
回傳的是一個vector,裡面只有一個值 5。
如何建立vector
如果要建立一個vector,使用的是c
這個function,例如,假設有一組資料要代表成績:
score <- c(20,10,50,60) score結果是:
[1] 20 10 50 60
上面可以看到,vector只有一個維度,並且都是numeric。
vector沒辦法混不同形態,所以假設如下面,如果最後一個分數不小心用引號包起來:
scoreError <- c(20,10,50,"60") scoreError那麼最後結果會是:
[1] "20" "10" "50" "60"
除了用c
之外,還有一些別的方式可以建立vector,例如假設要建立1到5,可以用:
oneToFive <- 1:5 oneToFive執行結果:
[1] 1 2 3 4 5
如何使用vector
如果要從vector取值,可以用中括弧([]
)取,不過和一般語言不一樣,它是從1開始算起,而不是0。
例如上面的分數,如果要取得第三個人的分數,可以用:score[3]
除了用取那一筆的方式取得值,也可以用logic值來說這個vector是否要取到,下面例子就是用logic vector 來取值。
假設要找出所有分數在30分以上,可以用:
score > 30 score[score > 30]
vector logic可以有很多其他運用,舉例來說,如果要找出分數在30以上的比例,可以用:
mean(score > 30)
,得到的結果是0.5
因為30以上有2筆,總共4筆,所以是百分之50.
上面那個可以work是因為,logic的FALSE和TRUE其實就是0和1。 所以直接做平均從(mean
)就是把0和1 相加然後除去總數。
如何新增和刪除資料
要新增一筆資料其實非常簡單,只需要把值assign 到對應的位置即可。
例如假設第5個人的分數是100,那麼可以這樣做:
score[5] <- 100
反過來,如果要刪掉,其實就是重新assing就可以。例如把第5筆資料刪掉就會是:
score <- score[1:4]
list - 1維 但是 內容形態可以不一樣
如果說資料是1個維度但是每一個資料的形態不同,那麼可以使用list。
如何建立list
c
是用來建立vector,而list
就是用來建立list用。
舉例來說,假設最後一個不知道為什麼是字串,那麼:
listScore <- list(20,10,50,"60")
那麼listScore
的值會是:
[[1]] [1] 20 [[2]] [1] 10 [[3]] [1] 50 [[4]] [1] "60"
更合理一點的例子會是,假設要把每一個分數的對應使用者名稱也加上,就可以用兩個vector在用list組合:
name <- c("A", "B", "C", "D") scoreWithName <- list(name,score)
這個時候scoreWithName
就會是:
[[1]] [1] "A" "B" "C" "D" [[2]] [1] 20 10 50 60
如何使用List
雖然list是1維,但是因為可以不同形態,所以很有可能裡面包的是一個vector,甚至是list,因此在取值的方式上面有些許的不同。
要取得第一個list資料用的是兩個中括弧,因此,假設想要取得第一個人的名字,用法會是:
scoreWithName[[1]][1] # A
其他和一般vector沒有太大兩樣。
結語
在這篇介紹了R的兩種資料結構,分別為1維度同類型的vector及1維度但可以不同類型的list。
在下一篇將會把整個資料結構做個總結,分別介紹2維度同類型的matrix,及2維度不同類型的dataframe
參考資料
- Advanced R 裡面介紹 Data Structure
- http://adv-r.had.co.nz/Data-structures.html
沒有留言 :
張貼留言