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

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

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

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

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

x <- c(3, 4, 5, 6, 7)
我們觀察到c()函數(shù)構造向量的幾個要求
這里的 c就是 combine 或 concatenate 的意思它要求元素之間用英文的逗號分隔 且元素的數(shù)據(jù)類型是統(tǒng)一的,比如這里都是數(shù)值
聚合成新向量
c() 函數(shù)還可以把兩個向量聚合成一個新的向量。
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
單個值的向量,就可以偷懶
我們再回頭看看之前的
x <- 6
它實際上就是
x <- c(6)
即長度為 1 的向量,相當于,只有一個草莓的糖葫蘆。在我看來,x <- 6 是 x <- c(6) 偷懶的寫法。
向量的屬性
我們再來看看向量的兩個基本屬性
x <- c(3, 4, 5, 6, 7)
類型
typeof(x)
長度
length(x)
數(shù)值型向量
向量的元素都是數(shù)值類型,因此也叫數(shù)值型向量。
數(shù)值型的向量,有 integer 和 double 兩種:
x <- c(1L, 5L, 2L, 3L) # 整數(shù)型
x <- c(1.5, -0.5, 2, 3) # 雙精度類型,常用寫法
x <- c(3e+06, 1.23e2) # 雙精度類型,科學計數(shù)法
數(shù)值型向量,偷懶方法1
但如果向量元素很多,用手工一個個去輸入,實際運用中不現(xiàn)實。在特定情況下,有幾種偷懶方法:
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(重復)的意思,可以用于產(chǎn)生重復出現(xiàn)的數(shù)字序列:times指定要生成的個數(shù)each?指定每個元素重復的次數(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ù)類型,實際上就是文本類型,必須用單引號或者是雙引號包含
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)
邏輯型向量
邏輯型常稱為布爾型(Boolean):
常量值只有 TRUE 和 FALSE。 TRUE 和 FALSE 在R語言中是保留詞匯
x <- c(TRUE, TRUE, FALSE, FALSE)
x <- c(T, T, F, F) # 與上等價,但不推薦
以下兩者不要混淆
x <- c(TRUE, FALSE) # 邏輯型
x <- c("TRUE", "FALSE") # 字符串型
因子型向量
因子型可以看作是字符串向量的增強版,它是帶有層級(Levels)信息的字符串向量。
比如,這里四個季節(jié)的名稱,他們構成一個向量。
four_seasons <- c("spring", "summer",
"autumn", "winter")
我們使用 factor() 函數(shù)將其轉(zhuǎn)換成因子型向量
four_seasons_factor <- factor(four_seasons)
four_seasons_factor
因子型向量
查看因子型向量的時候,同時也顯示層級信息
默認的情況,它是按照字符串首字母的順序排序
four_seasons_factor <- factor(four_seasons)
four_seasons_factor
也可以指定順序,比如按照我對四個季節(jié)的喜歡排序
four_seasons_factor <- factor(
four_seasons,
levels = c("summer", "winter", "spring", "autumn")
)
four_seasons_factor
小結

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

它實際上是向量的另一種表現(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
矩陣

矩陣的屬性
類型
class(m)
長度
length(m)
維度
dim(m)
矩陣
向量是一個豎著的糖葫蘆,在轉(zhuǎn)換成矩陣的時候,也是先豎著排,第一列豎著的方向排滿后,就排第二列,這是默認的情形。
如果想改變這一傳統(tǒng)習慣,也可以增加一個語句
byrow = TRUE,這條語句讓向量先橫著排,排完第一行,再排第二行。
matrix(
c(2, 4, 3, 1, 5, 7), nrow = 2, byrow = TRUE
)
列表
想象有一個小火車,小火車的每節(jié)車廂是獨立的,因此每節(jié)車廂裝的東西可以不一樣。這種結構,裝載數(shù)據(jù)的能力很強大,稱之為列表(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)建列表
相同點:元素之間用逗號分開。 不同點: 向量的元素是單個值;列表的元素可以是更復雜的結構,可以是向量、矩陣或者列表。 向量要求每個元素的數(shù)據(jù)類型必須相同,要么都是數(shù)值型,要么都是字符型;而列表的元素允許不同的數(shù)據(jù)類型。

列表的屬性
類型
class(list1)
長度
length(list1)
數(shù)據(jù)框
列表是一個小火車,如果每節(jié)車廂裝的都是向量而且等長,那么這種特殊形式的列表就變成了數(shù)據(jù)框 (data frame)
創(chuàng)建數(shù)據(jù)框
我們可以使用 data.frame() 函數(shù)構建
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ù)科學的統(tǒng)計建模和可視化中運用非常廣泛。
數(shù)據(jù)框的屬性
類型
class(df)
維度
nrow(df)
ncol(df)
數(shù)據(jù)結構
R 對象的數(shù)據(jù)結構(向量、矩陣、列表和數(shù)據(jù)框),總結如下

