2018年2月10日 星期六

[Data Science 到底是什麼從一個完全外行角度來看][18]R語言基礎 中篇 - 1維度資料結構介紹

image
圖片來源: https://pixabay.com/en/books-spine-colors-pastel-1099067/https://pixabay.com/en/math-blackboard-education-classroom-1547018/

在上一篇([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基本上可以從兩個面向來看:

  1. 幾個維度
  2. 是否整個資料屬於同一個type
image
幾種data structure

如果上面的描述還是看不太懂,那麼往下看就會了解這兩個面向的意思。

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"
注意到了嗎,被轉換成了所有都是char - 而不是數字

除了用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]
            
image
第一個得到是一個vector logic,然後用他來取得值

vector logic可以有很多其他運用,舉例來說,如果要找出分數在30以上的比例,可以用:

mean(score > 30),得到的結果是0.5

因為30以上有2筆,總共4筆,所以是百分之50.

上面那個可以work是因為,logic的FALSETRUE其實就是01。 所以直接做平均從(mean)就是把0和1 相加然後除去總數

如何新增和刪除資料

要新增一筆資料其實非常簡單,只需要把值assign 到對應的位置即可。

例如假設第5個人的分數是100,那麼可以這樣做:

score[5] <- 100
        

反過來,如果要刪掉,其實就是重新assing就可以。例如把第5筆資料刪掉就會是:

score <- score[1:4]
        
上面提到的一些使用和增刪資料和接下來的structure操作起來概念一樣,因此不會特別在介紹。

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沒有太大兩樣。

以剛剛的例子,貌似要建立分數和名稱的對應需要用list,但是實際上不太建議,因為取值的時候不太方便並且不直覺。後面介紹的dataframe 反而會是比較適合的形態。

結語

在這篇介紹了R的兩種資料結構,分別為1維度同類型的vector及1維度但可以不同類型的list

在下一篇將會把整個資料結構做個總結,分別介紹2維度同類型的matrix,及2維度不同類型的dataframe

參考資料

Advanced R 裡面介紹 Data Structure
http://adv-r.had.co.nz/Data-structures.html

沒有留言 :

張貼留言