Alan Tsai 的學習筆記


學而不思則罔,思而不學則殆,不思不學則“網貸” 為現任微軟最有價值專家 (MVP)、微軟認證講師 (MCT) 、Blogger、Youtuber:記錄軟體開發的點點滴滴 著重於微軟技術、C#、ASP .NET、Azure、DevOps、Docker、AI、Chatbot、Data Science

[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

如果文章對您有幫助,就請我喝杯飲料吧
街口支付QR Code
街口支付QR Code
台灣 Pay QR Code
台灣 Pay QR Code
Line Pay 一卡通 QR Code
Line Pay 一卡通 QR Code
街口支付QR Code
支付寶QR Code
街口支付QR Code
微信支付QR Code
comments powered by Disqus