1 R 資料結構
本章為 Zamora Saiz et al. (2020) 節 2.2 內容。
1.1 變數與基本的運算
以下分別是「加」、「減」、「乘」、「除」、「餘數除法」、與「整數除法」:
3 + 4
3 - 4
3 * 4
3 / 4
15 %% 2 # get "1"
15 %/% 2 # get "7"
我們可以 <-
來指派值給變數:
<- 3 * 4
x <- 4 * 20
y <- x + y
z # get "92" z
最基本的資料型態有三種:numeric
、character
與 logical
。numeric
即數字,character
即字串而 logical
即布林值 TRUE
或 FALSE
。此外,使用 as.integer()
可以把 numeric
轉成型態 integer
,1也另有複數為型態 complex
。而我們可以使用 class()
來查看變數的資料型態,如:
<- 4.3
GPA class(GPA) # get "'numeric'"
<- "GPA"
word class(word) # get "'character'"
<- TRUE
yes.no class(yes.no) # get "'logical'"
<- as.integer(5)
GTA class(GTA) # get "'integer'"
<- 2 + 5i
complex.number class(complex.number) # get "'complex'"
as.integer(TRUE)
我們也可以使用科學記號代表很大的數,如:
2.35e7 # get "23500000"
Logical value 也可以進行運算,其中 TRUE
代表 1,而 FALSE
代表 0,如:
TRUE + TRUE # get "2"
TRUE + FALSE # get "1"
TRUE * FALSE # get "0"
FALSE * FALSE # get "0"
此外,還有兩種特殊的資料型態:NULL
與 NA
。當我們指派一個 NULL
給一個變數時,會讓其變成一個空的物件。
<- NULL
null.object # get "NULL"
null.object class(null.object) # get "'NULL'"
而 NA
的意思是 non-available,常常表示 missing data。但特別的是用 class()
檢視為 NA
的變數時會發現其為一 logical value。
<- NA
missing # get "NA"
missing class(missing) # get "'NA'"
NA
運算後也會產生 NA
:
1 + NA # get "NA"
TRUE - NA # get "NA"
1.2 向量
向量(vector)是一列元素。我們以 c()
可以創造向量,裡頭的元素可以是 numeric
、character
或 logical
其中一種,或者混合,而之間須以逗號分隔;我們可以用 length()
來得知向量的長度;如果裡頭的元素都是 numeric
、character
或 logical
其中一種,則該向量的型態即其元素的型態,如:
<- c(1, 2, 3, 4)
vector.numbers # get "1 2 3 4"
vector.numbers length(vector.numbers) # "4"
class(vector.numbers) # get "'numeric'"
<- c("R", "is", "cool")
vector.characters # get "'R' 'is' 'cool'"
vector.characters class(vector.characters) # get "'character'"
<- c(TRUE, FALSE)
vector.logicals # get "TRUE FALSE"
vector.logicals class(vector.logicals) # get "'logical'"
但如果是向量內有不同種類的元素,那麼 R 會去讓向量裡的元素的型態變得更「一般」,即 character 優先於 numeric 又優先於 logical,就連 NA
都能被變成其他型態,如:
c("I", "am", 1) # get "'I' 'am' '1'"
class(c("I", "am", 1)) # get "'character'"
c("He", "is", "the", TRUE) # get "'He' 'is' 'the' 'TRUE'"
class(c("He", "is", "the", TRUE)) # get "'character'"
c(1, FALSE) # get "1 0"
class(c(1, FALSE)) # get "'numeric'"
c(NA, "1") # get "NA '1'"
class(c(NA, "1")) # get "'character'"
c(NA, TRUE) # get "NA TRUE"
class(c(NA, TRUE)) # get "'logical'"
1.2.1 創造向量的其他方法
如果我們要創造一個連續的向量,可以使用 a:b
,如:
3:12 # get "3 4 5 6 7 8 9 10 11 12"
class(3:12) # get "'numeric'"
如果我們想要重複(repeat)某個數字或某群數字好幾遍,可以使用 rep()
,例如:
rep(c(3, -1, 0.5), 3) # get "3.0 -1.0 0.5 3.0 -1.0 0.5 3.0 -1.0 0.5"
rep(c(3, -1, 0.5), times=3) # get "3.0 -1.0 0.5 3.0 -1.0 0.5 3.0 -1.0 0.5"
# 所以第二個 argument 預設是整串重複幾次的意思
# 但也能改成個別重複幾次,如下:
rep(c(3, -1, 0.5), each=3) # get "3.0 3.0 3.0 -1.0 -1.0 -1.0 0.5 0.5 0.5"
或者,我們可以在第二個 argument 丟入一個向量,指定第一個 argument 的個別的向量分別要重覆幾次,但這時候會長得像在第二個 argument 丟入 each=
的樣子,如:
rep(c(3, -1, 0.5), times=c(2, 1, 3)) # get "3.0 3.0 -1.0 0.5 0.5 0.5"
我們也可以在第二個 argument 丟入一個 length.out=
,這會使第一個 argument 的向量重複,而直到長度與 length.out=
的值相當,如:
rep(c(3, -1, 0.5), length.out=8) # get "3.0 -1.0 0.5 3.0 -1.0 0.5 3.0 -1.0"
除了手動輸入、使用 a:b
或者以 rep()
的方式產生向量,我們還可以使用 seq()
,這可以創造出一個數列。seq()
有三個引數,第一個引數為起始值,第二個引數為結束值,第三個引述則為公差,如:
seq(0, 10, 2.5) # get "0.0 2.5 5.0 7.5 10.0"
seq(0, 10, 2.3) # get "0.0 2.3 4.6 6.9 9.2"
1.2.2 標籤
只要創建了向量,裡頭的元素就能以 name()
命名。在我們要指出向量中的特定元素時還蠻有用的。此功能也有點像 Python 裡頭的字典,如:
<- c(28, 29, 27, 27, 30)
temperatures names(temperatures) <- c("Monday", "Tuesday", "Wednesday",
"Thursday", "Friday")
temperatures
## Monday Tuesday Wednesday Thursday Friday
## 28 29 27 27 30
這時候,ouput 就不會有 [1]
了,而是變成結構性的帶有標籤的向量。此外,如果要新增一個有同樣多座標且標籤順序一致的向量,有兩種方法。第一種方法是直接把 names(標籤向量)
指派給 names(欲標籤的向量)
,這樣會把前者的標籤貼到後者身上;或者,我們還是可以仿效原先的做法,再新創一個同等長度的字串向量,然後輸入 names(欲標籤的向量)
,如下:
# Method 1
<- c(0, 5, 6, 0, 2)
rains names(rains) <- names(temperatures)
rains
## Monday Tuesday Wednesday Thursday Friday
## 0 5 6 0 2
# Method 2
<- rep(NULL, 5) # 先清空剛剛指派的 named num [1:5]
rains <- c(0, 5, 6, 0, 2)
rains <- c("Monday", "Tuesday", "Wednesday", "Thursday", "Friday")
days names(rains) <- days
rains
## Monday Tuesday Wednesday Thursday Friday
## 0 5 6 0 2
1.2.3 向量的運算
而如果我們想要把向量中的每個數字都加上另一個數字,只要直接把兩個物件相加就行了(雖然這違反了數學邏輯的公理);如果要把向量中的每個數字都乘上某個數字也是同理,如攝氏溫標轉換成凱式溫標與華氏溫標:
# Kelvin degrees
<- temperatures + 273.15
Ktemp Ktemp
## Monday Tuesday Wednesday Thursday Friday
## 301.15 302.15 300.15 300.15 303.15
# Fahrenheit degrees
<- temperatures * 1.8 + 32
Ftemp Ftemp
## Monday Tuesday Wednesday Thursday Friday
## 82.4 84.2 80.6 80.6 86.0
減、除、次方也是類似的道理。
此外,sum()
可以將所有向量的座標加總,如:
<- sum(rains)
total.rains # get "13" total.rains
1.2.4 存取向量中的元素
在 R 語言中,第一個位置是 1(而不像有些語言是從 0 開始),並依序下去。如果我們要存取一個向量中的元素,可以直接指定向量中的位置;若要存取多個元素,就要使用 變數[c(想指定的位置)]
;存取連續的位置則依然可以使用 a:b
;當然也可以丟等差數列 seq()
進去,如:
# 存取一個元素
2] rains[
## Tuesday
## 5
# 存取多個元素
c(2, 5)] rains[
## Tuesday Friday
## 5 2
# 存取連續的元素
2: 5] rains[
## Tuesday Wednesday Thursday Friday
## 5 6 0 2
# 等差地存取元素
seq(1, 5, 2)] rains[
## Monday Wednesday Friday
## 0 6 2
除了以位置來存取,當然也可以標籤來存取向量中的元素,如:
c("Monday", "Tuesday")] rains[
## Monday Tuesday
## 0 5
1.2.5 關係
<
:小於。>
:大於。<=
:小於或等於。>=
:大於或等於。==
:相等。!=
:不相等。
在兩個值之間加入這些關係符號,會輸出一個布林值,描述兩者的關係是否符合輸入的關係,如:
4 > 3 # get "TRUE"
4 != 4 # get "FALSE"
向量也能與一個數字比較,此時會依據向量裡頭的位置順序,連帶著標籤(如果有的話),輸出各個座標的布林值,如:
> 0 rains
## Monday Tuesday Wednesday Thursday Friday
## FALSE TRUE TRUE FALSE TRUE
也能考慮多重的關係。&
代表的是「且」(and),而 |
代表的是「或」(or),而函數 xor()
在其中一者為真一者為假時會回傳真,在兩者皆真或皆假的情況會回傳假,如:
3 == 4 & 3 == 3 # get "FALSE"
3 == 4 | 3 == 3 # get "TRUE"
3 < 5 & 4 > 2 # get "TRUE"
TRUE & TRUE & FALSE # get "FALSE"
xor(3 > 2, FALSE) # get "TRUE"
xor(3 > 2, TRUE) # get "FALSE"
xor(3 < 2, FALSE) # get "FALSE"
我們可以運用這些比較關係來確認向量裡頭的元素是否符合某個性質。例如是否下雨、是否溫度高於某個給定的溫度,即:
# 沒下雨的日子
<- rains == 0
not.rainy.days not.rainy.days
## Monday Tuesday Wednesday Thursday Friday
## TRUE FALSE FALSE TRUE FALSE
# 炎熱的日子
<- temperatures >= 29
hot.days hot.days
## Monday Tuesday Wednesday Thursday Friday
## FALSE TRUE FALSE FALSE TRUE
還可以用剛剛新建的向量,來存取原先向量中的位置,如:
# 在 hot.days 中,Tues. 與 Fri. 是真
# 所以 rains 中 Tues. 與 Fri. 標籤的位置的標籤與值會被叫出來
rains[hot.days]
## Tuesday Friday
## 5 2
此外,我們可以透過兩個函數來一次檢查向量中的元素與某個性質之間的關係,即 all()
與 any()
。前者在都有滿足的情況下就會回傳 TRUE
,反之則回傳 FALSE
;後者在其中一個座標有滿足的情況下就會回傳 TRUE
,反之則回傳 FALSE
。例如以下分別為「如果所有日子氣溫都大於等於 28 度則回傳 TRUE
」與「如果其中一天氣溫恰等於 30 度則回傳 TRUE
」,即:
all(temperatures >= 28) # get "FALSE"
any(temperatures >= 30) # get "TRUE"
另外,which()
則可以找到滿足條件的位置,即回傳為 TRUE
的位置的標籤與索引值,如找出溫度恰等於 27 度的日子:
which(temperatures == 27)
## Wednesday Thursday
## 3 4
1.2.6 排序
我們可以使用 order()
,其引數為一個向量,而此函數會回傳此向量中的元素的索引值為一個向量,由原向量的元素由小到大排列。如下,order(some.vector)
回傳的向量的第一個元素為 5
,這意味著原先的向量中最小的元素 2
其索引值為 5
,而次小的元素 3
其索引值為 1
,依此類推,最大的元素 9
其索引值為 3
:
<- c(3, 7, 9, 6, 2, 8)
some.vector order(some.vector)
## [1] 5 1 4 2 6 3
所以,將 order(some.vector)
作為 some.veector[]
的引數(回憶節 1.2.4),我們可以由小到大重新排列向量,即回傳一個向量,其第一個元素為原向量索引值 5
的元素,其值為 2
,依此類推,如:
order(some.vector)] some.vector[
## [1] 2 3 6 7 8 9
不過要把向量由小排到大也可以使用 sort()
就是了。此操作不會改變原本的向量的排序,但會回傳排序後的向量。不過與上面的方法不同的是,此方法無法知道這些值原先在什麼位置:
<- c(3, 7, 9, 6, 2, 8)
some.vector sort(some.vector)
## [1] 2 3 6 7 8 9
1.2.7 其他操作
我們可以使用 sum()
將向量的所有元素的值加總;max()
與 min()
則分別會回傳其中最大與最小的值;range()
則將回傳向量中的元素的範圍(即同時回傳 min()
與 max()
);mean()
可以計算向量的算術平均,如:
sum(some.vector) # get "35"
max(some.vector) # get "9"
min(some.vector) # get "2"
range(some.vector) # get "2 9"
mean(some.vector) # get "5.833333"
結合 which()
(回傳為 TRUE 的位置的標籤與索引值)與 max()
(找到氣溫最高的值),就可以找到氣溫最高的日子的標籤與索引值,如:
temperatures
## Monday Tuesday Wednesday Thursday Friday
## 28 29 27 27 30
which(temperatures == min(temperatures))
## Wednesday Thursday
## 3 4
max(temperatures)
## [1] 30
1.3 矩陣
1.3.1 創建矩陣
我們可以用 matrix()
來創建矩陣,其語法為:
matrix(data = NA, nrow = 1, ncol = 1, byrow = FALSE, dimnames = NULL)
其中,data
為我們要放進矩陣的向量資料;nrow
為 row 的數量;ncol
為 column 的數量;byrow
為以 column 或 row 的方式填滿矩陣(預設為 FALSE
,即以 column 的方式填滿矩陣);dimnames
則可以添加一個 list 為 row 與 column 的名字到矩陣(見節 1.6)。
對於 byrow
的用法如下兩個例子:
matrix(1:6, nrow = 2, byrow = TRUE)
## [,1] [,2] [,3]
## [1,] 1 2 3
## [2,] 4 5 6
matrix(1:6, nrow = 2, byrow = FALSE) # default argument
## [,1] [,2] [,3]
## [1,] 1 3 5
## [2,] 2 4 6
而如果我們以向量的資料填滿矩陣,只要丟入 nrow
或 ncol
其中一者的引數即可,R 會根據資料的長度,算出 column 或 row 該要是多少。但如果向量資料的長度無法非 nrow
或 ncol
,就會出現 Warning
。但 R 還是會像資料長度為 nrow
或 ncol
的因數的情況一樣,從頭開始以原本的向量把矩陣給填滿,如:
matrix(1:11, nrow = 3)
## Warning in matrix(1:11, nrow = 3): data length [11] is not a sub-multiple or
## multiple of the number of rows [3]
## [,1] [,2] [,3] [,4]
## [1,] 1 4 7 10
## [2,] 2 5 8 11
## [3,] 3 6 9 1
矩陣也可以放以 character 或 logical 組成的向量資料,如:
matrix(c("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"), nrow = 4)
## [,1] [,2] [,3]
## [1,] "January" "May" "September"
## [2,] "February" "June" "October"
## [3,] "March" "July" "November"
## [4,] "April" "August" "December"
matrix(c(TRUE, FALSE, TRUE, TRUE, FALSE, FALSE), nrow = 2)
## [,1] [,2] [,3]
## [1,] TRUE TRUE FALSE
## [2,] FALSE TRUE FALSE
我們可以 rownames()
與 colnames
為 row 與 column 加上名字,使用方法如:
<- matrix(c(temperatures, rains), byrow = TRUE, nrow = 2)
climate rownames(climate) <- c("Temperatures", "Rains")
colnames(climate) <- days
climate
## Monday Tuesday Wednesday Thursday Friday
## Temperatures 28 29 27 27 30
## Rains 0 5 6 0 2
我們可以透過 dim(想得知的矩陣)
得知 row 與 column 的數量,如:
dim(climate) # get "2 5"
1.3.2 合併矩陣與矩陣運算
我們可以透過 rbinds()
與 cbinds()
在矩陣新增 row 或 column,如:
<- c(30, 25, 22, 24, 18)
Winds <- rbind(climate, Winds)
total.climate total.climate
## Monday Tuesday Wednesday Thursday Friday
## Temperatures 28 29 27 27 30
## Rains 0 5 6 0 2
## Winds 30 25 22 24 18
我們可以使用 rowSums()
或 colSums()
把各個 row 或 column 的值加起來。把各個 row 的值相加以後指派給變數 totals
,然後與原先的 climate
合併,就如:
<- rowSums(total.climate)
totals cbind(total.climate, totals)
## Monday Tuesday Wednesday Thursday Friday totals
## Temperatures 28 29 27 27 30 141
## Rains 0 5 6 0 2 13
## Winds 30 25 22 24 18 119
1.3.3 存取矩陣中的元素
存取矩陣的方式與向量類似,即 矩陣[row, col]
,如:
2, 3] # get "6" total.climate[
如果不輸入 row 的引數,則會列出該 column 所有的資料,如下列出了週三的氣溫、雨量及風速:
3] total.climate[,
## Temperatures Rains Winds
## 27 6 22
如果不輸入 column 的引數,則會列出該 row 所有的資料,如下列出了每日的雨量:
2, ] total.climate[
## Monday Tuesday Wednesday Thursday Friday
## 0 5 6 0 2
另外,也可以直接指定某個 row 或 column 的名字來存取資料,如:
"Wednesday"] total.climate[,
## Temperatures Rains Winds
## 27 6 22
"Rains",] total.climate[
## Monday Tuesday Wednesday Thursday Friday
## 0 5 6 0 2
"Rains", "Wednesday"] total.climate[
## [1] 6
1.3.4 矩陣的運算
我們可以用 mean()
計算向量的算術平均,我們也能以此計算矩陣的 column 或 row 的算術平均。例如想要計算每天的平均氣溫,可以如下:
mean(total.climate["Temperatures", ])
## [1] 28.2
矩陣也能像向量一般運算(回憶節 1.2.3),如:
* 2 climate
## Monday Tuesday Wednesday Thursday Friday
## Temperatures 56 58 54 54 60
## Rains 0 10 12 0 4
^ 2 climate
## Monday Tuesday Wednesday Thursday Friday
## Temperatures 784 841 729 729 900
## Rains 0 25 36 0 4
# 計算雨量與氣溫的比例
2, ] / climate[1, ] climate[
## Monday Tuesday Wednesday Thursday Friday
## 0.00000000 0.17241379 0.22222222 0.00000000 0.06666667
1.4 Factors
質性或類別變數(qualitative or categorical variable)的值即類別,而非數值。把向量丟到 factor()
中可以把向量轉換成 factor。
創建一個向量 sizes
,如:
<- c("Small", "Big", "Big", "Medium", "Medium", "Small", "Medium", "Small", "Small")
sizes sizes
## [1] "Small" "Big" "Big" "Medium" "Medium" "Small" "Medium" "Small"
## [9] "Small"
但這時候如果用 summary()
,我們只看得到資料長度和他們的類別:
summary(sizes)
## Length Class Mode
## 9 character character
此時,把向量丟到 fator()
中將會回傳不太一樣的結果,並且 summary()
將會回傳各個值出現的次數;levels()
則會回傳此 factor vector 中有哪些元素(重複的不計),如:
<- factor(sizes)
factor.sizes factor.sizes
## [1] Small Big Big Medium Medium Small Medium Small Small
## Levels: Big Medium Small
summary(factor.sizes)
## Big Medium Small
## 2 3 4
levels(factor.sizes)
## [1] "Big" "Medium" "Small"
類別變數可以分為無序(nominal)與有序(ordinal)兩種。前者如顏色,後者如尺寸。如果要讓變數是有序的,我們在 factor()
中須將引數 ordered
設置為 TRUE
,並且以引數 levels = 向量
由小到大地來描述順序關係,如:
<- c("Small", "Big", "Big", "Medium", "Medium", "Small", "Medium", "Small", "Small")
sizes2 <- factor(sizes, ordered=TRUE, levels=c("Small", "Medium", "Big"))
factor.sizes2 factor.sizes2
## [1] Small Big Big Medium Medium Small Medium Small Small
## Levels: Small < Medium < Big
我們也可以把向量指派給 level(目標 factor)
,來覆寫 factor 中的值,如:
<- c("M", "F", "F", "M", "M", "F", "M", "M")
survey.vector <- factor(survey.vector)
factor.survey.vector # 此時儲存的順序是 "F M",因此可以 c("Female", "Male") 覆寫之
levels(factor.survey.vector) <- c("Female", "Male")
factor.survey.vector
## [1] Male Female Female Male Male Female Male Male
## Levels: Female Male
無序的 factor 的元素無法比較,但有序的可以,如:
1] < factor.sizes2[2] # get "TRUE"
factor.sizes2[2] == factor.sizes2[2] # get "TRUE"
factor.sizes2[2] != factor.sizes2[3] # get "FALSE" factor.sizes2[
1.5 Data Frames
在 vectors 與 matrices 中,資料都會儲存成一樣的型態。但進行資料分析時,我們會同時處理不同型態的資料。此時我們需要 data frames 來儲存資料表。與矩陣不同的是, data frames 可以儲存不同型態的資料。R 有內置的 datasets,可以使用以下指令查看其資訊:
?datasetslibrary(help="datasets")
我們也可以使用 data()
查看電腦內現有的 datasets。
我們可以使用其中一個現成的 dataset OrchardSprays
。輸入 OrchardSprays
可以查看整個表。我們可以發現有四個變數,分別是 decrease
、rowpos
、colpos
與 treatmenet
。decrease
為對處置的反應,以數值記載;rowpos
與 colpos
分別代表其 design 的 row 與 column;treatment
則為 A
至 H
的類別變數。以 head(OrchardSprays)
可以查看表格的前六個 rows。以 str()
可以獲知表格的資訊,如:
str(OrchardSprays)
## 'data.frame': 64 obs. of 4 variables:
## $ decrease : num 57 95 8 69 92 90 15 2 84 6 ...
## $ rowpos : num 1 2 3 4 5 6 7 8 1 2 ...
## $ colpos : num 1 1 1 1 1 1 1 1 2 2 ...
## $ treatment: Factor w/ 8 levels "A","B","C","D",..: 4 5 2 8 7 6 3 1 3 2 ...
我們可以用 dataframe()
來創建 data frames。其中的引數放入向量,而依序構成該 data frames 的各個 columns,如:
<- c("Alfonso", "Carlos", "Lluis", "Diego")
name <- c("Zamora", "Quesada", "Hurtado", "Mondejar")
last.name <- c("Saiz", "Gonzalez", "Gil", "Ruiz")
second.last.name <- c(33, 32, 30, 37)
age <- c("math", "math", "physics", "math")
phd <- c(4, 14, 6, 8)
office <- c(FALSE, TRUE, FALSE, TRUE)
from.madrid <- data.frame(name, last.name, second.last.name, age, phd, office, from.madrid)
professors str(professors)
## 'data.frame': 4 obs. of 7 variables:
## $ name : chr "Alfonso" "Carlos" "Lluis" "Diego"
## $ last.name : chr "Zamora" "Quesada" "Hurtado" "Mondejar"
## $ second.last.name: chr "Saiz" "Gonzalez" "Gil" "Ruiz"
## $ age : num 33 32 30 37
## $ phd : chr "math" "math" "physics" "math"
## $ office : num 4 14 6 8
## $ from.madrid : logi FALSE TRUE FALSE TRUE
1.5.1 存取 data frames 中的元素與 subset
想要選取 data frames 中的元素,就像選取矩陣中的元素一樣,即 dataframes[row, col]
,如:
2, 3]
professors[1, ] # 顯示第一個 row
professors[2] # 顯示第二個 column
professors[, 1 : 2, ] # 選擇頭兩個 rows professors[
要注意的是,data frames 的 column 的名字是來自 column vector 的名字,所以我們也可以用 $
來存取特定的 column vector,如:
$phd professors
## [1] "math" "math" "physics" "math"
$phd[3] professors
## [1] "physics"
我們還可以用 logical 的方式來叫出 data frames 的 subset,例如要叫出 from.madrid
為 TRUE
的兩個 rows,即:
<- professors$from.madrid
madrileans professors[madrileans, ]
## name last.name second.last.name age phd office from.madrid
## 2 Carlos Quesada Gonzalez 32 math 14 TRUE
## 4 Diego Mondejar Ruiz 37 math 8 TRUE
以指令 subset(data_frame, subset=logical_condition)
也能做到類似的事,如:
subset(professors, subset=age > 31)
## name last.name second.last.name age phd office from.madrid
## 1 Alfonso Zamora Saiz 33 math 4 FALSE
## 2 Carlos Quesada Gonzalez 32 math 14 TRUE
## 4 Diego Mondejar Ruiz 37 math 8 TRUE
subset(professors, subset=phd == "math")
## name last.name second.last.name age phd office from.madrid
## 1 Alfonso Zamora Saiz 33 math 4 FALSE
## 2 Carlos Quesada Gonzalez 32 math 14 TRUE
## 4 Diego Mondejar Ruiz 37 math 8 TRUE
1.5.2 排序
想要以某個特定的變數的順序整理 data frames,可以使用 order()
,如:
<- order(professors$age)
positions professors[positions, ]
## name last.name second.last.name age phd office from.madrid
## 3 Lluis Hurtado Gil 30 physics 6 FALSE
## 2 Carlos Quesada Gonzalez 32 math 14 TRUE
## 1 Alfonso Zamora Saiz 33 math 4 FALSE
## 4 Diego Mondejar Ruiz 37 math 8 TRUE
1.5.3 其他操作
我們可以 as.data.frame()
把矩陣轉為 data frames。
1.6 Lists
Lists 就像向量,但其元素可以有不同的長度、大小、型態。我們可以用 list()
創建 lists,如:
<- list(days, factor.sizes, climate)
new.list new.list
## [[1]]
## [1] "Monday" "Tuesday" "Wednesday" "Thursday" "Friday"
##
## [[2]]
## [1] Small Big Big Medium Medium Small Medium Small Small
## Levels: Big Medium Small
##
## [[3]]
## Monday Tuesday Wednesday Thursday Friday
## Temperatures 28 29 27 27 30
## Rains 0 5 6 0 2
我們也可以選取 lists 中的元素,如:
1] # 第一個元素
new.list[1]][3] # 第一個元素中的第三個元素
new.list[[3]][1, 2:5] # 第三個元素中的第一個 row 的第二至五個的元素 new.list[[
我們也可以為 list 中的元素命名,如將第一個元素命名為 the.days
、第二個元素命名為 the.factors
、將第三個元素命名為 the.data
:
<- list(the.days=days, the.factors=factor.sizes, the.data=climate)
new.list new.list
## $the.days
## [1] "Monday" "Tuesday" "Wednesday" "Thursday" "Friday"
##
## $the.factors
## [1] Small Big Big Medium Medium Small Medium Small Small
## Levels: Big Medium Small
##
## $the.data
## Monday Tuesday Wednesday Thursday Friday
## Temperatures 28 29 27 27 30
## Rains 0 5 6 0 2
這樣就可以用 $名字
來存取 list 中的元素,如:
$the.factors
new.list$the.data[2, 5]
new.list"the.data"] new.list[
如果要新增元素到 list,可以 list_name[["名字"]] <- 要輸入的物件
指令,其中名字當然是選擇性的,也能空下來;此外,如果要刪除 list 中的成份,只要指派 NULL
給它就行,如:
"professors"]] <- professors # 新增第四個元素,名為 "professors" 的 data frames
new.list[[""]] <- positions # 新增第五個元素,無名的向量
new.list[[5]] <- NULL # 刪除第五個元素
new.list[["professors"]] <- NULL # 刪除名為 "professors" 的元素 new.list[[
我們也可以用 str()
來查看 lists 的資訊,如:
str(new.list)
參考文獻
傳
character
至as.integer
的話將會產生NA
,傳TRUE
或FALSE
的話會變成整數 1 或 0,而傳complex
的話則虛數的部份將會被自動捨棄。↩︎