R語(yǔ)言基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)
本文內(nèi)容
對(duì)象 向量 數(shù)據(jù)結(jié)構(gòu) 運(yùn)算符及向量運(yùn)算 函數(shù) 子集選取
對(duì)象
對(duì)象
R語(yǔ)言里一切都是對(duì)象(object)。

對(duì)象的創(chuàng)建
對(duì)象的創(chuàng)建與使用。首先確定一個(gè)對(duì)象名,然后使用賦值操作符 <-,將數(shù)據(jù)賦值給它。

在Rstudio中同時(shí)按下 Alt 和 -,就可以產(chǎn)生賦值箭頭

對(duì)象的創(chuàng)建與使用
我們給這個(gè)盒子取名 x,然后把10這個(gè)數(shù)放入盒子。
x <- 10
當(dāng)鍵入 x 然后回車(chē),就打印出 x 的值。
x
對(duì)象重新賦值
當(dāng)我們?cè)侔?這個(gè)數(shù)放入盒子x后
x <- 6
此時(shí)x就被更新了,變成了最新的數(shù)值
x
變量命名規(guī)則
變量名必須以字母、數(shù)字、下劃線(xiàn) _和句點(diǎn).組成開(kāi)頭不能是數(shù)字 大小寫(xiě)敏感, y和Y是兩個(gè)不同的變量名不能有空格,可以用下劃線(xiàn)代替空格,比如
my_age <- 30
變量名的可讀性
測(cè)量男生的身高
一般的變量名
x <- 175
不錯(cuò)變量名
height <- 175
更佳的變量名
boy_height_cm <- 175
對(duì)象屬性
x <- 6
所有R對(duì)象都有其屬性,最重要的兩個(gè)屬性:
類(lèi)型 長(zhǎng)度
typeof(x)
length(x)
向量
盒子可以裝更多數(shù)據(jù)
前面,我們把6這個(gè)數(shù)放入盒子 x,
x <- 6
現(xiàn)在,我們想多裝一些數(shù)據(jù)(有順序、好取出),比如3,4,5,6,7
x <- 3, 4, 5, 6, 7 # 這樣可以嗎?
冰糖葫蘆
我們小時(shí)候吃的冰糖葫蘆,中間用一根木棒把水果串起來(lái),有先后順序,而且方便取出。
knitr::include_graphics("images/vector_like11.jpg", dpi = 300)
向量就像冰糖葫蘆
對(duì)應(yīng)到R語(yǔ)言里,用 c() 函數(shù)實(shí)現(xiàn)類(lèi)似結(jié)構(gòu)

x <- c(3, 4, 5, 6, 7)
x
向量就像冰糖葫蘆

x <- c(3, 4, 5, 6, 7)
我們觀(guān)察到c()函數(shù)構(gòu)造向量的幾個(gè)要求
這里的 c就是 combine 或 concatenate 的意思它要求元素之間用英文的逗號(hào)分隔 且元素的數(shù)據(jù)類(lèi)型是統(tǒng)一的,比如這里都是數(shù)值
聚合成新向量
c() 函數(shù)還可以把兩個(gè)向量聚合成一個(gè)新的向量。
low <- c(1, 2, 3)
high <- c(4, 5, 6)
sequence <- c(low, high)
sequence
命名向量(named vector)
向量元素可以有自己的名字
x <- c('a' = 5, 'b' = 6, 'c' = 7, 'd' = 8)
x
或者
x <- c(5, 6, 7, 8)
names(x) <- c('a', 'b', 'c', 'd')
x
單個(gè)值的向量,就可以偷懶
我們?cè)倩仡^看看之前的
x <- 6
它實(shí)際上就是
x <- c(6)
即長(zhǎng)度為 1 的向量,相當(dāng)于,只有一個(gè)草莓的糖葫蘆。在我看來(lái),x <- 6 是 x <- c(6) 偷懶的寫(xiě)法。
向量的屬性
我們?cè)賮?lái)看看向量的兩個(gè)基本屬性
x <- c(3, 4, 5, 6, 7)
類(lèi)型
typeof(x)
長(zhǎng)度
length(x)
數(shù)值型向量
向量的元素都是數(shù)值類(lèi)型,因此也叫數(shù)值型向量。
數(shù)值型的向量,有 integer 和 double 兩種:
x <- c(1L, 5L, 2L, 3L) # 整數(shù)型
x <- c(1.5, -0.5, 2, 3) # 雙精度類(lèi)型,常用寫(xiě)法
x <- c(3e+06, 1.23e2) # 雙精度類(lèi)型,科學(xué)計(jì)數(shù)法
數(shù)值型向量,偷懶方法1
但如果向量元素很多,用手工一個(gè)個(gè)去輸入,實(shí)際運(yùn)用中不現(xiàn)實(shí)。在特定情況下,有幾種偷懶方法:
seq()函數(shù)可以生成等差數(shù)列,from參數(shù)指定數(shù)列的起始值,to參數(shù)指定數(shù)列的終止值,by參數(shù)指定數(shù)值的間距:
s1 <- seq(from = 0, to = 10, by = 0.5)
s1
數(shù)值型向量,偷懶方法2
rep()是 repeat(重復(fù))的意思,可以用于產(chǎn)生重復(fù)出現(xiàn)的數(shù)字序列:times指定要生成的個(gè)數(shù)each?指定每個(gè)元素重復(fù)的次數(shù)
s2 <- rep(x = c(0, 1), times = 3)
s2
s3 <- rep(x = c(0, 1), each = 3)
s3
數(shù)值型向量,偷懶方法3
m:n,如果單純是要生成數(shù)值間距為1的數(shù)列,用m:n更快捷,它產(chǎn)生從 m 到 n 的間距為1的數(shù)列
# Colon operator (with by = 1):
s4 <- 0:10
s4
s5 <- 10:1
s5
字符串型向量
字符串(String)數(shù)據(jù)類(lèi)型,實(shí)際上就是文本類(lèi)型,必須用單引號(hào)或者是雙引號(hào)包含
x <- c("a", "b", "c")
x <- c('Alice', 'Bob', 'Charlie', 'Dave')
x <- c("hello", "baby", "I love you!")
需要注意的是,x1是字符串型向量,x2是數(shù)值型向量
x1 <- c("1", "2", "3")
x2 <- c(1, 2, 3)
邏輯型向量
邏輯型常稱(chēng)為布爾型(Boolean):
常量值只有 TRUE 和 FALSE。 TRUE 和 FALSE 在R語(yǔ)言中是保留詞匯
x <- c(TRUE, TRUE, FALSE, FALSE)
x <- c(T, T, F, F) # 與上等價(jià),但不推薦
以下兩者不要混淆
x <- c(TRUE, FALSE) # 邏輯型
x <- c("TRUE", "FALSE") # 字符串型
因子型向量
因子型可以看作是字符串向量的增強(qiáng)版,它是帶有層級(jí)(Levels)信息的字符串向量。
比如,這里四個(gè)季節(jié)的名稱(chēng),他們構(gòu)成一個(gè)向量。
four_seasons <- c("spring", "summer",
"autumn", "winter")
我們使用 factor() 函數(shù)將其轉(zhuǎn)換成因子型向量
four_seasons_factor <- factor(four_seasons)
four_seasons_factor
因子型向量
查看因子型向量的時(shí)候,同時(shí)也顯示層級(jí)信息
默認(rèn)的情況,它是按照字符串首字母的順序排序
four_seasons_factor <- factor(four_seasons)
four_seasons_factor
也可以指定順序,比如按照我對(duì)四個(gè)季節(jié)的喜歡排序
four_seasons_factor <- factor(
four_seasons,
levels = c("summer", "winter", "spring", "autumn")
)
four_seasons_factor
小結(jié)

前面介紹了向量,它是R語(yǔ)言中最基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu),我們還會(huì)遇到其它數(shù)據(jù)結(jié)構(gòu)
矩陣 列表 數(shù)據(jù)框
這些數(shù)據(jù)結(jié)構(gòu)都可以看作由向量衍生出來(lái)的。
矩陣
矩陣可以存儲(chǔ)行(row)和列(column)二維的數(shù)據(jù)

它實(shí)際上是向量的另一種表現(xiàn)形式。
矩陣
矩陣可以用 matrix() 函數(shù)創(chuàng)建,第一位參數(shù)的位置是用于創(chuàng)建矩陣的向量。比如下面把向量c(2, 4, 3, 1, 5, 7) 轉(zhuǎn)換成2行3列的矩陣
m <- matrix(
c(2, 4, 3, 1, 5, 7),
nrow = 2,
ncol = 3
)
m
矩陣

矩陣的屬性
類(lèi)型
class(m)
長(zhǎng)度
length(m)
維度
dim(m)
矩陣
向量是一個(gè)豎著的糖葫蘆,在轉(zhuǎn)換成矩陣的時(shí)候,也是先豎著排,第一列豎著的方向排滿(mǎn)后,就排第二列,這是默認(rèn)的情形。
如果想改變這一傳統(tǒng)習(xí)慣,也可以增加一個(gè)語(yǔ)句
byrow = TRUE,這條語(yǔ)句讓向量先橫著排,排完第一行,再排第二行。
matrix(
c(2, 4, 3, 1, 5, 7), nrow = 2, byrow = TRUE
)
列表
想象有一個(gè)小火車(chē),小火車(chē)的每節(jié)車(chē)廂是獨(dú)立的,因此每節(jié)車(chē)廂裝的東西可以不一樣。這種結(jié)構(gòu),裝載數(shù)據(jù)的能力很強(qiáng)大,稱(chēng)之為列表(list)。

創(chuàng)建列表
list1 <- list(
a = c(5, 10),
b = c("I", "love", "R", "language", "!"),
c = c(TRUE, TRUE, FALSE, TRUE)
)
list1
創(chuàng)建列表

列表
c() 函數(shù)創(chuàng)建向量 Vs. list() 函數(shù)創(chuàng)建列表
相同點(diǎn):元素之間用逗號(hào)分開(kāi)。 不同點(diǎn): 向量的元素是單個(gè)值;列表的元素可以是更復(fù)雜的結(jié)構(gòu),可以是向量、矩陣或者列表。 向量要求每個(gè)元素的數(shù)據(jù)類(lèi)型必須相同,要么都是數(shù)值型,要么都是字符型;而列表的元素允許不同的數(shù)據(jù)類(lèi)型。

列表的屬性
類(lèi)型
class(list1)
長(zhǎng)度
length(list1)
數(shù)據(jù)框
列表是一個(gè)小火車(chē),如果每節(jié)車(chē)廂裝的都是向量而且等長(zhǎng),那么這種特殊形式的列表就變成了數(shù)據(jù)框 (data frame)
創(chuàng)建數(shù)據(jù)框
我們可以使用 data.frame() 函數(shù)構(gòu)建
df <- data.frame(
name = c("Alice", "Bob", "Carl", "Dave"),
age = c(23, 34, 23, 25),
marriage = c(TRUE, FALSE, TRUE, FALSE),
color = c("red", "blue", "orange", "purple")
)
df
數(shù)據(jù)框就是我們經(jīng)常用的excel表格

由于數(shù)據(jù)框融合了向量、列表和矩陣的特性,所以在數(shù)據(jù)科學(xué)的統(tǒng)計(jì)建模和可視化中運(yùn)用非常廣泛。
數(shù)據(jù)框的屬性
類(lèi)型
class(df)
維度
nrow(df)
ncol(df)
數(shù)據(jù)結(jié)構(gòu)
R 對(duì)象的數(shù)據(jù)結(jié)構(gòu)(向量、矩陣、列表和數(shù)據(jù)框),總結(jié)如下

