[R語言初學] R語言當中的資料結構
0![[R語言初學] R語言當中的資料結構](https://i0.wp.com/r-lover.com/wp-content/uploads/2023/06/QQ.jpeg?fit=1300%2C975&ssl=1)
Last Updated on 2023-10-22
你聽說過R語言當中有向量(vector)和因子(factor),但分辨不出差異嗎?最實用的資料表(dataframe)又要怎麼操作?本文告訴你
上一篇文章中,我們分別介紹了R語言的資料型態(data type)和基本運算(basic operations),這個章節則要帶大家認識資料結構(data structure)。
我們曾經比喻,「資料結構就是房屋的架構,有可能是用行列搭建,也可能採不規則的樑柱排序。」的確,R語言當中也有多種資料結構,每種資料結構都各自代表獨特的、將資料拼湊組合在一起的方法。
我會在這篇文章介紹R語言當中的資料結構,配上實際程式碼,從向量一路討論到資料表,一網打盡。
觀念釐清:資料型態、資料結構與資料格式的差異
我們來複習一下資料型態(Data Type)、資料結構(Data Structure)與資料格式(Data Format)的意義跟差別。
資料型態(Data Type)
- 意義:資料型態指資料儲存的原始型態,可以說是資料的最小單位。
- 範例:
int
eger,float
,string
,boolean
等。
資料結構(Data Structure)
- 意義:資料結構指將資料組合後儲存的長相與形式。
- 範例:
Array
,Linked List
,Stack
,Queue
,Tree
,Graph
等。在R語言當中以vector, list, dataframe為主。
資料格式(Data Format)
- 描述:資料格式指資料儲存的規範或標準,用來定義交換、展示與儲存資料在文件或其他媒介中的方法。
- 範例:
CSV
,JSON
,XML
,JPEG
,MP3
等。在R語言當中最有特色的是RDS,只能用R語言打開。
關係與差異
- 資料型態是最基本的單位,用於界定變數或對象可以存儲哪種類型的數據。
- 資料結構是由多個資料型態的資料組成,用來提升儲存、排序、搜尋資料的效率。
- 資料格式更往上一層,規定了(用特定資料結構儲存的)資料(用特定資料結構已經組織在某種
Data Structure
中)如何存在電腦裡、與他人交換。
總結來說,資料型態最基礎,資料結構由資料型態組合而成,而資料格式則是用於儲和存交換資料結構和資料型態的標準或規範。
以台灣籃球聯盟T1為例,想看某場比賽球員的表現,球員名字以character的資料型態儲存、得分以integer的資料型態儲存,將兩者以資料結構組合成dataframe,再輸出成csv, xlsx,讓其他人也能方便讀取。
R語言的資料結構
R語言的資料結構包含一維的向量(vector)與因子(factor)、二維的矩陣(matrix)與資料表(dataframe)、多維度的列表(list)與陣列(array)。底下我們會逐一介紹!
維度 | 同質的 | 異質的 |
---|---|---|
1d | Atomic vector | List |
2d | Matrix | Data frame |
nd | Array |
R資料結構, 出處: Advanced R
向量 vector
向量是R語言當中,資料表以外最為常見的資料結構,它的組成為型態一致的一維資料。什麼是一維資料?以平面坐標軸為例子,有x軸與y軸兩條軸線,代表有兩個維度,若再加上z軸,那就會變成三維,再往上加較難直觀理解,但仍可以憑空想像,例如科幻小說《三體》當中就有高達十一維的描述。
在R當中,想要創建向量有很多種方式,大家最常用到的就是利用c()
函數。底下展示幾個賦值方法不同、但實際內容都是 1,2,3,4,5
的向量:
a <- c(1,2,3,4,5)
b <- c(1:5)
c <- seq(1,5,1)
d <- vector("numeric",length = 5)
d[1] <- 1
d[2] <- 2
d[3] <- 3
d[4] <- 4
d[5] <- 5
a;b;c;d
#> [1] 1 2 3 4 5
#> [1] 1 2 3 4 5
#> [1] 1 2 3 4 5
#> [1] 1 2 3 4 5
在這4個向量當中,a
是利用R語言當中最基本函數之一的c()
,將值包裹其中,直接賦值。b
的情形相同,只不過額外利用:
將式子寫得簡潔。“:
”代表數列,1:5
的意思等同於1,2,3,4,5
,當數值多的時候寫來較為輕鬆。
至於c
,則使用了seq()
這個函數,seq()
裡面一共放了三個「東西」,分別是代表起始點得1
、代表終點的5
、代表間距的1
。這些「東西」有個專有名詞,稱為參數(argument),函數裡面會包覆好幾種用途不同的參數,通常都是在開發套件與函數者的巧思下制定而成。
回到seq(1,5,1)
,它的意思就是從創建一個「從1
開始到5
結束、以1
為間距的向量。」底下我們會再舉其他例子。
以替d
賦值的vector()
函數為例子,它的用途是創建一個空無一物的向量,第一個參數意義是資料型態,我們在此指定了"numeric"
,第二個參數意義則是向量長度。我們先用vector()
創建空的向量之後,接著再用[]
,把數值塞到這個空向量之中,[n]
的ˋ作用是取向量中的第n
個元素。
剛剛有提到,向量當中的元素資料型態相同,如果不同的時候,會發生什麼事情?
c(3,2,"2")
#> [1] "3" "2" "2"
c("T",T,"F")
#> [1] "T" "TRUE" "F"
c(F,T,0)
#> [1] 0 1 0
如上所示,第1個例子中,會都變成最包容的字元,第2個例子也是相同,同樣變成字元,第3個例子中則變成數值。知道這個特性後,對後面比較跟運算時很有幫助。
如果想查看或是抽取元素,我們會利用上面提到的 []
。
a <- c(1,3,5,7,9)
a[1]
#> [1] 1
對只有學過R的人來說,想取第幾個元素,方框裡面就用第幾個數字,非常好懂;但對學過其他程式語言的人來說,情況不太一樣,因為例如 Python 就是從 0 開始,因此要小心別弄錯了!
創建向量,並且知道怎麼抽取其中元素以後,我們可以來看向量的操作與運算。
c(1,2,3,4,5) + c(5,4,3,2,1)
#> [1] 6 6 6 6 6
c(1,2,3,4,5) * c(5,4,3,2,1)
#> [1] 5 8 9 8 5
c(1,2,3,4,5) + c(1, 2)
#> Warning in c(1, 2, 3, 4, 5) + c(1, 2): longer object length is not a multiple of shorter object length
#> [1] 2 4 4 6 6
從第1與第2個例子可以發現,向量是以元素為單位(element-wise)進行運算,每個元素會各自相加或者相乘;第3個例子則顯示,若是兩個向量長度不等長,則會自動補齊,所以其實最後會變成 c(1,2,3,4,5) + c(1,2,1,2,1)
。
c(1,2,3,4,5) > 1
#> [1] FALSE TRUE TRUE TRUE TRUE
c(1,2,3,4,5) > c(5,4,3,2,1)
#> [1] FALSE FALSE FALSE TRUE TRUE
c("A","C","D") > c("B","B","B")
#> [1] FALSE TRUE TRUE
c("3","2","1") > c(2,2,2)
#> [1] TRUE FALSE FALSE
比較大小時,同樣會發生長度補齊跟型態轉換,所以在第1個例子中,左邊向量的每個元素都在跟1
比較;第3個元素中,則是比較這些字母在編碼中的順序;第4個例子中,因為比大小的緣故,兩邊的向量都從字元轉變成數值了!
a <- c(1,3,5,7,9)
a[c(1,2,5)]
#> [1] 1 3 9
a[a > 4]
#> [1] 5 7 9
a[-1]
#> [1] 3 5 7 9
a[length(a)]
#> [1] 9
知道怎麼比大小之後,我們就可以用比較進階的作法取值。在a[a > 4]
這個例子中,其實真正在做的事情是a[c(F,F,T,T,T)]
,所以才會取出最後3個元素。
加上負號的意思則是代表不要那個(些)元素,因此a[-1]
代表的就是拿掉第1個元素。其他例子只要看程式碼就能體會囉!
a <- c(1,2,4)
b <- c(3,4,9,2)
c(a,b)
#> [1] 1 2 4 3 4 9 2
sum(a)
#> [1] 7
min(b)
#> [1] 2
sort(b)
#> [1] 2 3 4 9
創造以外,c()
函數還能夠拼接(concatenate)向量。還有其他內建函數,包含sum()
、min()
、sort()
等,但我沒有介紹太多函數,因為如果太仰賴函數,就會失去動腦的機會了,而且記誦這些函數也會很消耗大腦的空間,把運算能力花在思考達成任務比較重要,這是我的一點想法。
總結一下關於向量的幾個特徵:
- 向量是R語言當中的基本資料結構,裡面放資料型態相同的元素,可以是數值、字元等
- 創建向量時除了使用
c()
賦值外,還有如seq()
或是創建空的向量再補上元素等方式 - 可以對向量運算,長度不等時會補齊,比大小時則會發生型態轉變
- 想提取元素時會使用
[]
,除了在裡面塞數字,還可以用負號、比較等多方式 c()
不只有創建向量的功能,還可以把不同向量黏在一起
因子 factor
什麼是因子呢?我們可以將它理解為有順序之分的變數,例如性別、地區、政黨別等等。
嚴格來說,因子屬於向量的一種,它等於在向量上面多加了特性(attribute),變成有順序的向量。
當然,我們可以用字元型態就好,但因子的順序,讓它在後面繪製圖表或是呈現資料需要排序時,就能派上用場。
底下以中華職棒的球隊來舉例:
cpbl <- factor(c("中信兄弟","樂天桃猿","味全龍","富邦悍將","統一獅"))
cpbl
#> [1] 中信兄弟 樂天桃猿 味全龍 富邦悍將 統一獅
#> Levels: 中信兄弟 味全龍 富邦悍將 樂天桃猿 統一獅
輸出的結果第一行是原始的資料長相,第二行則是呈現它有什麼種類。
利用class()
可以看到它被稱為factor,levels()
則讓我們看到這個因子的種類。
class(cpbl)
#> [1] "factor"
levels(cpbl)
#> [1] "中信兄弟" "味全龍" "富邦悍將" "樂天桃猿" "統一獅"
如果在一個因子裡面加入其他新的種類,會發生什麼事情呢?
cpbl[6] <- "崇越棒球隊"
#> Warning in `[<-.factor`(`*tmp*`, 6, value = "崇越棒球隊"): invalid factor level, NA generated
cpbl
#> [1] 中信兄弟 樂天桃猿 味全龍 富邦悍將 統一獅 <NA>
#> Levels: 中信兄弟 味全龍 富邦悍將 樂天桃猿 統一獅
宛若是呼應現實,崇越並沒有要加入中職,如同warnings訊息所說,因為這是在既有的因子中加入從沒看過的內容,所以會變成NA
。
想要成真的話,要怎麼改變呢?我們以真的要加入職棒的台鋼雄鷹為例,首先要先修改level,加入新種類後,接下來在因子中就可以成功指派不同的因子內容了。
levels(cpbl) <- c(levels(cpbl),"台鋼雄鷹")
levels(cpbl)
#> [1] "中信兄弟" "味全龍" "富邦悍將" "樂天桃猿" "統一獅" "台鋼雄鷹"
cpbl[6] <- "台鋼雄鷹"
cpbl
#> [1] 中信兄弟 樂天桃猿 味全龍 富邦悍將 統一獅 台鋼雄鷹
#> Levels: 中信兄弟 味全龍 富邦悍將 樂天桃猿 統一獅 台鋼雄鷹
後續講述tidyverse
的時候,會介紹forcats
套件,裡面會有許多操作因子的函數。包含重整levels、排序、把數量太小的levels合併變成「其他」等,針對因子會著墨更多。
列表 list
從向量再往前一步,就來到了讓人愛恨交織的列表(list)。
列表很靈活,可以同時容納不同資料結構的元素(element),既可以放向量,也可以把另一個列表塞進去。
# 創建一個包含不同類型元素的list
teacher_liu <- list(
name = "Mr.Liu",
age = 30,
course = c("社群網絡","R語言入門","政治學概論","社會科研究方法"),
students = c(10, 15, 30, 25),
detail = list(
language = "R",
level = "advanced"
)
)
teacher_liu
#> $name
#> [1] "Mr.Liu"
#>
#> $age
#> [1] 30
#>
#> $course
#> [1] "社群網絡" "R語言入門" "政治學概論" "社會科研究方法"
#>
#> $students
#> [1] 10 15 30 25
#>
#> $detail
#> $detail$language
#> [1] "R"
#>
#> $detail$level
#> [1] "advanced"
從上面的例子我們能夠注意到,teacher_liu
裡面有 5 個元素,前面 4 個都是向量,最後一個則是列表。我們會稱這種「列表中的列表」為 nested list,如果之後你遇上相關問題,可以用這個關鍵字搜尋。
創建列表很簡單,使用 list()
即可,過程中可以留意是否要指定名字。
# 不指定名字
list_noname <- list(c("a","b","c"), 0, list(list(2), 3, 1))
list_noname
#> [[1]]
#> [1] "a" "b" "c"
#>
#> [[2]]
#> [1] 0
#>
#> [[3]]
#> [[3]][[1]]
#> [[3]][[1]][[1]]
#> [1] 2
#>
#>
#> [[3]][[2]]
#> [1] 3
#>
#> [[3]][[3]]
#> [1] 1
# 指定名字
list_name <- list("甲" = c("a","b","c"), "乙" = 0, "丙" = list(list(2), 3, 1))
list_name
#> $甲
#> [1] "a" "b" "c"
#>
#> $乙
#> [1] 0
#>
#> $丙
#> $丙[[1]]
#> $丙[[1]][[1]]
#> [1] 2
#>
#>
#> $丙[[2]]
#> [1] 3
#>
#> $丙[[3]]
#> [1] 1
從顯示的結果上面,你一定發現了金錢符號:$
以及中括號,中括號又分為一層的[]
以及兩層的[[]]
。$
和[]
的用途是什麼呢?就像向量一樣,這兩個符號可以幫我們從列表中抓取元素。
list_name <- list("甲" = c("a","b","c"), "乙" = 0, "丙" = list(list(2), 3, 1))
# 用 $
list_name$`丙`
#> [[1]]
#> [[1]][[1]]
#> [1] 2
#>
#>
#> [[2]]
#> [1] 3
#>
#> [[3]]
#> [1] 1
# 用 []
list_name[3]
#> $丙
#> $丙[[1]]
#> $丙[[1]][[1]]
#> [1] 2
#>
#>
#> $丙[[2]]
#> [1] 3
#>
#> $丙[[3]]
#> [1] 1
str(list_name[3])
#> List of 1
#> $ 丙:List of 3
#> ..$ :List of 1
#> .. ..$ : num 2
#> ..$ : num 3
#> ..$ : num 1
# 用 [[]]
list_name[[3]]
#> [[1]]
#> [[1]][[1]]
#> [1] 2
#>
#>
#> [[2]]
#> [1] 3
#>
#> [[3]]
#> [1] 1
str(list_name[[3]])
#> List of 3
#> $ :List of 1
#> ..$ : num 2
#> $ : num 3
#> $ : num 1
你可以發現,[]
和 [[]]
的效果並不一樣,但$
和[[]]
的效果相同。
使用 str()
函數可以讓我們看到物件的資料結構。由[]
取出的是一個列表,這個列表的層級和原先的列表層級一樣,差別在於從3個元素的列表變成1個而已。利用[[]]
,取出的則是第3個元素,就層級來說,我們可以發現它已經少了一「層」包裝了。
若是聽起來太過抽象,我們可以倒退一步,改成看比較簡單的元素,方便比較。
list_name <- list("甲" = c("a","b","c"), "乙" = 0, "丙" = list(list(2), 3, 1))
# 用 $
list_name$`甲`
#> [1] "a" "b" "c"
# 用 []
list_name[1]
#> $甲
#> [1] "a" "b" "c"
str(list_name[1])
#> List of 1
#> $ 甲: chr [1:3] "a" "b" "c"
# 用 [[]]
list_name[[1]]
#> [1] "a" "b" "c"
str(list_name[[1]])
#> chr [1:3] "a" "b" "c"
這樣是不是就能看出差異了?由[]
取出的仍是列表,裡面有單一個元素「甲」,使用$
和[[]]
之後就真的拿到甲元素的內涵,所以我們得到c("a","b","c")
這樣的向量。
事實上,在程式碼中,我們可以用連續的好幾個金錢符號或者中括號,來對付包覆多層的列表。
list_name <- list("甲" = c("a","b","c"), "乙" = 0, "丙" = list(list(2), 3, 1))
# 簡單一點
list_name$`甲`
#> [1] "a" "b" "c"
list_name$`甲`[1] #等於取向量第一個元素
#> [1] "a"
# 複雜一點
list_name$`丙`[1]
#> [[1]]
#> [[1]][[1]]
#> [1] 2
list_name$`丙`[[1]]
#> [[1]]
#> [1] 2
list_name$`丙`[[1]][[1]]
#> [1] 2
你可以嘗試練習,因為「丙」這個子列表,本身又額外包了兩層,就list_name()
整體來看,等於有了3層,很適合當成素材。
列表的彈性可以是優勢,也能是劣勢,因為當結構太龐雜時,使用者容易感到混亂,對初學者來說也不是那麼友善。
總結一下關於列表的幾個特徵:
- 列表是R語言當中的基本資料結構,裡面有彈性地容納不同資料結構的元素
- 列表當中甚至可以塞下其他列表(nested list),日後撰寫函數面對不確定的情境時可以派上用場
- 想提取元素時會使用
$
、[]
、[[]]
等,也可以拼接它們,取出深埋在結構中的子元素
矩陣與陣列 matrix and array
在R語言中,矩陣(matrix)是一種二維的資料結構,陣列(array)的維度更高,它們同樣由相同資料型態的元素所組成。因為兩者性質相似,主要差異在維度,所以一起介紹。
查看特性前,我們先來看具體的例子。就以中華職棒的球隊為例,因為將會有6隊,所以我們可以創建一個3列x2行的矩陣,同時也可以創建一個3列x2行x1個高度的陣列。
# matrix
cpbl
#> [1] 中信兄弟 樂天桃猿 味全龍 富邦悍將 統一獅 台鋼雄鷹
#> Levels: 中信兄弟 味全龍 富邦悍將 樂天桃猿 統一獅 台鋼雄鷹
matrix_cpbl <- matrix(cpbl, nrow = 3, ncol = 2)
matrix_cpbl
#> [,1] [,2]
#> [1,] "中信兄弟" "富邦悍將"
#> [2,] "樂天桃猿" "統一獅"
#> [3,] "味全龍" "台鋼雄鷹"
# array
array_cpbl <- array(cpbl, dim = c(3,2,1))
array_cpbl
#> , , 1
#>
#> [,1] [,2]
#> [1,] "中信兄弟" "富邦悍將"
#> [2,] "樂天桃猿" "統一獅"
#> [3,] "味全龍" "台鋼雄鷹"
你有沒有發現,矩陣的長相很像,只是它多了第三個維度,也就是高度。
# array
array_number <- array(1:24, dim = c(3,2,2,2))
array_number
#> , , 1, 1
#>
#> [,1] [,2]
#> [1,] 1 4
#> [2,] 2 5
#> [3,] 3 6
#>
#> , , 2, 1
#>
#> [,1] [,2]
#> [1,] 7 10
#> [2,] 8 11
#> [3,] 9 12
#>
#> , , 1, 2
#>
#> [,1] [,2]
#> [1,] 13 16
#> [2,] 14 17
#> [3,] 15 18
#>
#> , , 2, 2
#>
#> [,1] [,2]
#> [1,] 19 22
#> [2,] 20 23
#> [3,] 21 24
陣列可以不只有3個維度,我們能夠無限地往上調整維度,就像上面這個提高到4維的例子。
回到矩陣,因為R語言原先的使用者以統計學家為主,你可以想像,在R語言當中有諸多矩陣的運算能夠使用。不過,因為在日常性的資料分析,還有行銷、新聞的資料處理,基本上用不到矩陣運算,所以這邊就不多談。若你對R語言中的矩陣運算有著濃厚的興趣,不妨參考“Matrix operations in R”。
總結一下關於矩陣與陣列的幾個特徵:
- 矩陣與陣列都可以儲存多維度的資料,前者為2維,後者則是3維以上
- 矩陣與陣列裡面的元素類型都相同,例如數值,不能接受不同的資料型態
- 因為有行列的緣故,所以可以使用
[r,c]
或者[a,b,c]
的方式取出元素 - 創建矩陣與陣列時,都會先指定它的維度
資料表 dataframe
最後,我們總算可以迎接R語言中,最常見也最實用的資料結構,也就是資料表或者資料框(dataframe)。
什麼是資料表呢?
無論是一份微軟的 Excel 報表,或者是 Google 的試算表,都屬於資料表。
一份資料表dataframe的範例
像這樣4列2行的表格,若儲存在R裡面,這種資料結構就叫做資料表
在表格中,每一列(row)代表一個資料點、一個觀測值、一個樣本點,每一行(column)代表一個變數、一個特徵。要注意的是直行橫為列,是台灣的用法,跟對岸的叫法相反,要小心不要搞混囉!
若是想要創建資料表,我們比較少從零開始,一般都是從外部匯入資料,但還是要學習一下相關的函數。底下我們來看P League每季冠亞軍的資料表。
df_plg <- data.frame("季度" = c(1:3),
"冠軍" = c("臺北富邦勇士","臺北富邦勇士","臺北富邦勇士"),
"亞軍" = c("福爾摩沙台新夢想家","新竹街口攻城獅","新北國王"))
df_plg
#> 季度 冠軍 亞軍
#> 1 1 臺北富邦勇士 福爾摩沙台新夢想家
#> 2 2 臺北富邦勇士 新竹街口攻城獅
#> 3 3 臺北富邦勇士 新北國王
指定變數名稱,並提供每個變數的資料點,就可以創造出資料表。如果是匯入資料,我們則會活用 read_csv()
、read_excel()
、read_sheets()
、readODS()
等函數,讀取現成的csv、xlsx、ods等原始檔案。
另外,因為R語言內建的dataframe有先天上的限制,所以我偏好使用tidyverse裡面特別設計的tibble,它同樣是資料表,但相對好用一些。後面講述tidyverse的章節會另外介紹。
dim(df_plg)
#> [1] 3 3
str(df_plg)
#> 'data.frame': 3 obs. of 3 variables:
#> $ 季度: int 1 2 3
#> $ 冠軍: chr "臺北富邦勇士" "臺北富邦勇士" "臺北富邦勇士"
#> $ 亞軍: chr "福爾摩沙台新夢想家" "新竹街口攻城獅" "新北國王"
除了查看基本型態以外,還可以確認欄位名稱與列的名稱。實務上不太會用列名,因為我們通常會直接把列的名稱儲存成一個變數,這樣也比較不會搞混。
colnames(df_plg)
#> [1] "季度" "冠軍" "亞軍"
rownames(df_plg)
#> [1] "1" "2" "3"
若是要從資料表中取出某個變數的值,可以直接使用金錢符號$
。
# 取亞軍變數
df_plg$亞軍
#> [1] "福爾摩沙台新夢想家" "新竹街口攻城獅" "新北國王"
若是要選取資料表中的特定變數或者特定的列,則可以利用[]
處理。
# 取第一季的所有資料
df_plg[df_plg$季度==1,]
#> 季度 冠軍 亞軍
#> 1 1 臺北富邦勇士 福爾摩沙台新夢想家
# 取第一季的冠軍
df_plg[df_plg$季度==1,2]
#> [1] "臺北富邦勇士"
df_plg[df_plg$季度==1,"冠軍"]
#> [1] "臺北富邦勇士"
資料表有列與行兩個維度,在中括號裡面我們會用逗號間隔,逗號前是列,後面則是行。
來分拆一下df_plg[df_plg$季度==1,]
的內涵,先看前面這一部分df_plg$季度==1
,因為利用$
拉出季度,所以它已經變成一個向量了。
df_plg$季度==1
#> [1] TRUE FALSE FALSE
把這個向量放回去資料表的中括號裡面,代表我要第1列(TRUE),不要第2列和第3列(FALSE, FALSE)。
因為df_plg[df_plg$季度==1,]
後面沒有指定要哪一行(變數),所以它會給我所有第一季那個列的變數。
另外的例子中,df_plg[df_plg$季度==1,2]
和df_plg[df_plg$季度==1,"冠軍"]
,分別利用數字和變數名稱,指定第2列。
同樣地在後面tidyverse的章節中,我們會介紹select()
和filter()
等函數,快速地解決使用者在資料表中查找特定資料的需求。
library(dplyr)
#>
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#>
#> filter, lag
#> The following objects are masked from 'package:base':
#>
#> intersect, setdiff, setequal, union
filter(df_plg, `季度`==1)
#> 季度 冠軍 亞軍
#> 1 1 臺北富邦勇士 福爾摩沙台新夢想家
select(filter(df_plg, `季度`==1), `亞軍`)
#> 亞軍
#> 1 福爾摩沙台新夢想家
總結一下關於資料表的幾個特徵:
- 每個變數可以是不同的資料型態,相對向量來說更靈活
- 資料表有行的名字,也就是變數的名字,有些會有列的名字,但建議不要使用
- 資料表就是固定的直行橫列,沒有列表那麼彈性,但更好懂也更好操作
- 因為是二維的列與行,所以可以使用
[r,c]
的方式取出特定變數或者某一列的資料
看到這裡,你對於R語言當中的資料結構就有一定的理解了,我們接著會彎道超車,切入tidyverse的介紹,讓你領會R語言的真實魅力!
小結
這樣就結束了!我們從變數與賦值,一路介紹了數學、關係、邏輯等運算,接下來的文章會介紹資料結構,希望能夠帶你一步步進入R語言的世界。
No Comments