R 是一種動態類型語言,使用靈活,變量無需預先聲明類型。掌握 R 的數據類型和變量機制,是后續進行數據處理和建模分析的基礎。本章節主要介紹 R 語言中的常量、變量、基本數據類型及常用數據結構,并結合示例進行說明。
文章目錄
- 一、常量(Constants)
- 1. 數值型常量
- 2. 字符型常量
- 3. 邏輯型常量
- 4. 缺失值常量
- 5. 復數常量
- 二、變量(Variables)
- 1. 變量名命名規則
- 2. 變量賦值方式
- 3. 動態類型語言特征
- 三、基本數據類型(Atomic Types)
- 四、常用數據結構(Data Structures)
- 1. 向量(vector)
- 2. 矩陣(matrix)
- 3. 數據框(data.frame)
- 4. 列表(list)
- 5. 因子(factor)
- 五、數據訪問與子集提取
- 1. 向量訪問
- 2. 數據框訪問
- 3. 列表訪問
- 六、數值型向量及其運算(Numeric Vectors and Their Operations)
- 1. 數值型向量的創建
- 2. 標量與標量運算
- 3. 向量與標量運算
- 4. 向量與向量運算
- 5. 向量函數與向量化計算
- 6. 排序函數與順序函數
- 7. 常用統計函數
- 8. 序列與重復生成函數
- 9. 復數向量
- 七、邏輯型向量及其運算(Logical Vectors and Logical Operations)
- 1. 邏輯型向量與比較運算
- 比較運算符包括:
- 2. 邏輯運算
- 3. 邏輯運算函數
- 4.其他常用邏輯函數:
- 八、字符型數據及其處理(Character Data and String Handling)
- 1. 字符型向量
- 2. 轉義字符與原始字符串
- 3. 字符串拼接:`paste()` 函數
- 4. 轉換大小寫
- 5. 字符串長度計算
- 6. 提取子串
- 7. 類型轉換
- 8. 字符串替換
- 9. 正則表達式匹配
- 參考引用
一、常量(Constants)
常量是指程序中直接寫出的固定值,例如數字、字符串、邏輯值、復數等。在 R 中,常量具有不同的表現形式。
1. 數值型常量
數值型常量包括整數、浮點數和科學計數法表示形式。例如:
x1 <- 123
x2 <- -0.012
x3 <- 1.23e2 # 等價于123
x4 <- 123L # 表示整數類型(L 結尾)
2. 字符型常量
字符常量是由雙引號或單引號括起來的文本。在 R 中,字符類型用于表示字符串:
name1 <- "Li Ming"
name2 <- '李明'
注意:R 沒有單獨的“字符(character)”類型和“字符串(string)”類型,二者統一稱為 character。
3. 邏輯型常量
邏輯型常量僅包括 TRUE
和 FALSE
,表示布爾值:
flag1 <- TRUE
flag2 <- FALSE
flag3 <- flag1 & flag2 # 與操作
4. 缺失值常量
R 使用 NA
表示缺失值,廣泛出現在統計分析中。
v <- c(1, 2, NA, 4)
mean(v) # 返回 NA
mean(v, na.rm = TRUE) # 去除缺失值后計算均值
字符型空白不會自動識別為 NA,需要手動轉換。
5. 復數常量
R 支持復數類型。復數常量的形式如下:
z <- 2 + 3i
Mod(z) # 計算復數的模長
二、變量(Variables)
程序語言中的變量用來保存輸入的值或者計算得到的值。在 R 中,變量可以保存所有類型的數據,包括標量、向量、矩陣、數據框、函數等。
1. 變量名命名規則
變量名是變量的標識符。R 語言的變量命名需要遵循以下規則:
- 由字母、數字、下劃線
_
和句點.
組成; - 第一個字符不能為數字;
- R 中變量名區分大小寫,如
x
和X
是兩個不同的變量; - 在中文操作系統中,也可以使用中文作為變量名(不推薦)。
x <- 10
y <- 20
Data_1 <- "變量"
變量名 <- "合法但不推薦"
2. 變量賦值方式
R 中常用 <-
進行賦值,也可使用 =
。建議優先使用 <-
,更符合 R 編程規范。
a <- 5
b = 10
sum <- a + b
print(sum)
3. 動態類型語言特征
R 是動態類型語言,變量的類型在賦值時自動確定,可以隨時被修改為其他類型:
x <- 1.5 # 數值型
x <- "abc" # 重新賦值為字符型
x <- TRUE # 再次賦值為邏輯型
盡管 R 支持類型切換,實際編程中應避免頻繁更改同一變量的類型。
三、基本數據類型(Atomic Types)
R 語言的基本數據類型包括以下幾類:
類型 | 示例 | 類型判斷函數 |
---|---|---|
數值型 | x <- 3.14 | is.numeric(x) |
整數型 | x <- 5L | is.integer(x) |
字符型 | x <- "text" | is.character(x) |
邏輯型 | x <- TRUE | is.logical(x) |
復數型 | x <- 1+2i | is.complex(x) |
可使用 typeof()
或 class()
查看變量類型:
x <- 3.14
typeof(x) # 返回 "double"
class(x) # 返回 "numeric"
四、常用數據結構(Data Structures)
R 支持多種數據結構,用于組織和管理不同類型和維度的數據。
1. 向量(vector)
向量是 R 最基本的數據結構,包含相同類型的一組元素。
v <- c(1, 2, 3, 4)
length(v) # 返回元素個數
mean(v) # 求均值
2. 矩陣(matrix)
矩陣是二維向量,所有元素類型必須一致。
m <- matrix(1:6, nrow = 2, byrow = TRUE)
print(m)
3. 數據框(data.frame)
數據框是類似于表格的二維數據結構,每列可以是不同類型。
df <- data.frame(name = c("Tom", "Amy"),score = c(90, 85),passed = c(TRUE, FALSE)
)
print(df)
4. 列表(list)
列表是一種可容納任意類型對象的數據結構,常用于模型輸出、函數返回值等場景。
lst <- list(id = 1,name = "Tom",scores = c(85, 90)
)
lst$name
5. 因子(factor)
因子用于存儲分類變量,有固定的水平(levels)。
gender <- factor(c("Male", "Female", "Male"))
levels(gender)
summary(gender)
五、數據訪問與子集提取
R 提供多種方式訪問數據結構中的元素。
1. 向量訪問
v <- c(100, 200, 300)
v[2] # 返回第二個元素
2. 數據框訪問
df <- data.frame(id = 1:3, score = c(80, 85, 90))df[1, 2] # 第1行第2列
df$score # 按列名訪問
df[df$score > 80, ] # 篩選得分大于80的行
3. 列表訪問
lst <- list(name = "Amy", age = 25)
lst$name
lst[["age"]]
六、數值型向量及其運算(Numeric Vectors and Their Operations)
1. 數值型向量的創建
R 語言中,數值型向量是由一組數值組成的線性結構,是最基本的數據單位。可以使用 c()
函數將多個數值組合成一個向量,也可以通過冒號 :
或 seq()
函數生成等差數列。
x <- c(10, 6, 4, 7, 8)
y <- c(1:3, 10:13)
z1 <- c(1, 2)
z2 <- c(3, 4)
z <- c(z1, z2)
numeric(5) # 創建一個元素全部為 0、長度為 5 的向量
length(z) # 返回向量的長度
長度為 0 的向量用 numeric(0)
表示。
2. 標量與標量運算
R 中的標量(單個數值)本質上是長度為 1 的向量,支持加減乘除乘方等常見運算:
1.5 + 2.3 - 0.6 + 2.1 * 1.2 - 1.5 / 0.5 + 2^3
## [1] 10.72# 使用括號控制優先級
1.5 + 2.3 - (0.6 + 2.1) * 1.2 - 1.5 / 0.5 + 2^3
## [1] 5.56
R 還支持整除(%/%)和取余(%%):
5 %/% 3 # 商為 1
5 %% 3 # 余數為 2
3. 向量與標量運算
向量與標量進行運算時,會將標量擴展為與向量等長,逐元素進行運算:
x <- c(1, 10)x + 2 # 每個元素加 2
x * 2 # 每個元素乘 2
2 ^ x # 以 2 為底,對 x 中每個元素進行乘方
缺失值參與運算會返回缺失:
c(1, NA, 3) + 10
## [1] 11 NA 13
4. 向量與向量運算
兩個等長向量進行運算時,按對應元素逐一計算:
x1 <- c(1, 10)
x2 <- c(4, 2)x1 + x2 # [1] 5 12
x1 * x2 # [1] 4 20
如果向量長度不一致,但較長者是較短者長度的整數倍,R 會自動重復短向量的元素:
x1 <- c(10, 20)
x2 <- c(1, 3, 5, 7)x1 + x2
## [1] 11 23 15 27
若長度不是整數倍,將返回計算結果但伴隨警告信息:
c(1, 2) + c(1, 2, 3)
## Warning: longer object length is not a multiple of shorter object length
5. 向量函數與向量化計算
R 中的許多數學函數都是向量化的,接受向量輸入并返回對應的向量輸出:
sqrt(c(1, 4, 6.25))
## [1] 1.0 2.0 2.5log10(c(1, 10, 100))
exp(c(0, 1, 2))
常用函數包括:
- 平方根:
sqrt()
- 對數與指數:
log()
,log10()
,exp()
- 絕對值與符號:
abs()
,sign()
- 三角函數:
sin()
,cos()
,tan()
- 舍入:
round()
,floor()
,ceiling()
,trunc()
6. 排序函數與順序函數
排序函數可以用于向量排序及下標操作:
x <- c(33, 55, 11)sort(x) # 升序排列
rev(sort(x)) # 降序排列
order(x) # 獲取排序下標
x[order(x)] # 排序后的向量
7. 常用統計函數
R 中統計函數直接作用于數值向量,計算基本統計量:
x <- c(88, 92, 76, 81, 95, 67, 90, 85, 73, 89)mean(x) # 平均值
sd(x) # 標準差
min(x) # 最小值
max(x) # 最大值
median(x) # 中位數
sum(x) # 總和
range(x) # 范圍
還有累計函數:
cumsum(1:5) # 累計和
cumprod(1:5) # 累計積
8. 序列與重復生成函數
使用 seq()
生成規則數列,rep()
生成重復模式:
seq(1, 10, by = 2)
## [1] 1 3 5 7 9rep(0, 5) # 生成五個零
rep(c(1, 3), 2) # [1] 1 3 1 3
rep(c(1, 3), each = 2) # [1] 1 1 3 3
rep(c(1, 3), times = c(2, 4)) # [1] 1 1 3 3 3 3
seq()
與 :
區別:1:5
生成整數序列,seq(1, 5, by=1)
更靈活,可設步長、長度。
9. 復數向量
R 中可用 complex()
生成復數向量,支持實部、虛部或模角定義:
z <- complex(real = c(1, 0, -1, 0), imaginary = c(0, 1, 0, -1))
z
## [1] 1+0i 0+1i -1+0i 0-1iRe(z); Im(z); Mod(z); Arg(z); Conj(z)
當運算涉及復數時,需顯式寫出復數形式:
sqrt(-1)
## NaN with warningsqrt(-1 + 0i)
## [1] 0+1i
七、邏輯型向量及其運算(Logical Vectors and Logical Operations)
1. 邏輯型向量與比較運算
邏輯型(logical)是 R 的基本數據類型之一,只有兩個取值:TRUE
和 FALSE
,缺失值表示為 NA
。邏輯值通常來源于比較表達式。例如:
sele <- (log10(15) < 2)
print(sele)
## [1] TRUE
對向量進行比較時,會生成邏輯型向量,結果逐元素返回布爾值:
c(1, 3, 5) > 2
## [1] FALSE TRUE TRUE(1:4) >= (4:1)
## [1] FALSE FALSE TRUE TRUE
R 的比較遵循向量間運算的一般規則:
- 向量與標量之間比較:每個元素與標量分別比較;
- 等長向量比較:對應元素逐一比較;
- 不等長但滿足倍數關系:較短向量從頭重復利用。
含缺失值的比較將產生 NA
:
c(1, NA, 3) > 2
## [1] FALSE NA TRUENA == NA
## [1] NA
用 is.na()
判斷是否為缺失值,用 is.finite()
判斷是否為有限值:
is.na(c(1, NA, 3) > 2)
## [1] FALSE TRUE FALSE
比較運算符包括:
運算符 | 含義 |
---|---|
< | 小于 |
<= | 小于等于 |
> | 大于 |
>= | 大于等于 |
== | 等于(注意兩個等號) |
!= | 不等于 |
%in% | 是否屬于集合 |
%in%
將右側向量視為集合,判斷左側元素是否存在其中:
c(1, 3) %in% c(2, 3, 4)
## [1] FALSE TRUEc(NA, 3) %in% c(NA, 3, 4)
## [1] TRUE TRUE
函數 match(x, y)
與 %in%
類似,但返回的是匹配元素在 y
中首次出現的位置,若找不到返回 NA
:
match(c(1, 3), c(2, 3, 4, 3))
## [1] NA 2
2. 邏輯運算
為了表達復合條件,可以使用邏輯運算符將多個邏輯表達式連接:
運算符 | 含義 |
---|---|
& | 與(元素級) |
` | ` |
! | 非(取反) |
xor() | 異或:只在不相等時為真 |
示例:
age <- c(2, 5, 3, 6)
sex <- c("女", "女", "男", "男")# 女嬰(年齡≤3且性別為女)
age <= 3 & sex == "女"
## [1] TRUE FALSE FALSE FALSE# 嬰兒或女性
age <= 3 | sex == "女"
## [1] TRUE TRUE TRUE FALSE# 既非嬰兒也非女性
!(age <= 3 | sex == "女")
## [1] FALSE FALSE FALSE TRUE
短路邏輯運算符 &&
和 ||
只比較第一個元素,常用于 if
或 while
等流程控制語句中:
if (TRUE || sqrt(-1) > 0) print("不會報錯")
由于 TRUE || ...
的結果已確定,右側不會被執行,避免了運行錯誤。
3. 邏輯運算函數
有時需要從邏輯型向量中計算匯總結果,R 提供了如下函數:
all(x)
:所有元素為TRUE
時返回TRUE
any(x)
:任意一個元素為TRUE
即返回TRUE
which(x)
:返回邏輯值為TRUE
的下標
示例:
cond <- c(1, NA, 3) > 2all(cond)
## [1] FALSEany(cond)
## [1] TRUEwhich(cond)
## [1] 3
當邏輯向量全為缺失時:
all(NA)
## [1] NAany(NA)
## [1] NA
4.其他常用邏輯函數:
identical(x, y)
:判斷兩個對象是否完全相同(類型和值均一致)all.equal(x, y)
:判斷兩個對象是否“接近相等”,常用于數值誤差容忍比較duplicated(x)
:判斷每個元素是否在前面出現過unique(x)
:返回去重后的結果
示例:
duplicated(c(1, 2, 1, 3, NA, 4, NA))
## [1] FALSE FALSE TRUE FALSE FALSE FALSE TRUEunique(c(1, 2, 1, 3, NA, 4, NA))
## [1] 1 2 3 NA 4
identical(c(1L, 2L, 3L), c(1, 2, 3))
## [1] FALSE # 類型不一致:一個是整數,一個是雙精度all.equal(c(1L, 2L, 3L), c(1, 2, 3))
## [1] TRUE
八、字符型數據及其處理(Character Data and String Handling)
1. 字符型向量
字符型向量是元素為字符串的一類向量。在 R 中,字符串使用雙引號 ""
或單引號 ''
包裹。例如:
s1 <- c('abc', '', 'a cat', NA, '李明')
注意:空字符串 ""
不能自動識別為缺失值,字符型的缺失值需顯式寫為 NA
。
字符串的常見來源包括文件讀取、網絡請求、數據庫提取等,也可以直接在代碼中寫出。
2. 轉義字符與原始字符串
在字符串中包含特殊字符(如引號、換行符)時需使用反斜杠 \
進行轉義:
cat("\"\n")
## "
\n
表示換行。若字符串中包含較多轉義內容,可使用原始字符串語法 r"(...)"
:
cat(r"(C:\disk\course\math\nFinished!\n)")
## C:\disk\course\math\nFinished!\n
若原始字符串中包含圓括號 ()
,可改用 []
或 {}
,必要時還可加減號標識范圍:
r"[(...)]"、r"{...}"、r"--((...))--"
3. 字符串拼接:paste()
函數
paste()
是處理字符型向量最常用的函數。默認逐元素拼接,并以空格分隔:
paste(c("ab", "cd"), c("ef", "gh"))
## [1] "ab ef" "cd gh"
R 遵循向量化運算規則,支持數值自動轉換為字符串:
paste("x", 1:3)
## [1] "x 1" "x 2" "x 3"
-
使用
sep=
可指定分隔符:paste("x", 1:3, sep = "") ## [1] "x1" "x2" "x3"
-
使用
collapse=
可將整個字符向量合并為單個字符串:paste(c("a", "b", "c"), collapse = "") ## [1] "abc"
4. 轉換大小寫
R 提供了大小寫轉換函數:
toupper()
將字符串轉換為大寫;tolower()
將字符串轉換為小寫。
toupper("aB cd")
## [1] "AB CD"tolower(c("aB", "CD"))
## [1] "ab" "cd"
該方法常用于不區分大小寫的比較:
toupper("jan") == "JAN"
## [1] TRUE
5. 字符串長度計算
nchar(x, type = "chars")
:按字符數統計(中文一個字符);nchar(x, type = "bytes")
:按字節統計(中文通常占兩個字節)。
x <- c("abc", "李明")
nchar(x, type = "chars") # [1] 3 2
nchar(x, type = "bytes") # [1] 3 6
繪圖時可用 strwidth()
計算文本所占空間寬度。
6. 提取子串
substr(x, start, stop)
:提取指定起止位置的子串;substring(x, start)
:從指定位置提取到末尾。
substr("JAN07", 1, 3)
## [1] "JAN"substr(c("JAN07", "MAR66"), 1, 3)
## [1] "JAN" "MAR"substring(c("JAN07", "MAR66"), 4)
## [1] "07" "66"
7. 類型轉換
- 用
as.numeric()
將字符串轉換為數值; - 用
as.character()
將數值轉換為字符串; - 用
sprintf()
進行格式控制的轉換; - 使用
readr::parse_number()
提取字符串中的數值部分。
as.numeric(substr("JAN07", 4, 5)) + 2000
## [1] 2007as.character((1:5)*5)
## [1] "5" "10" "15" "20" "25"sprintf("file%03d.txt", c(1, 99, 100))
## [1] "file001.txt" "file099.txt" "file100.txt"readr::parse_number(c("output-123.txt", "30.2%", "abc"))
## [1] -123.000 30.200 NA
parse_number()
可提取字符串中的數值部分,而 parse_integer()
等函數則要求字符串完全為目標類型,否則返回 NA
并提供提示信息。
8. 字符串替換
用 gsub()
函數可以實現字符串中模式的替換操作,例如將標點統一或清理空格:
x <- "1, 3; 5"
gsub(";", ",", x, fixed = TRUE)
## [1] "1, 3, 5"
此類功能常用于數據預處理、文本清洗等場景。
9. 正則表達式匹配
正則表達式(regular expression)可用于模式匹配、查找與替換等高級文本處理。R 中支持 Perl 風格的正則語法,常用函數包括:
grepl()
/grep()
:匹配查詢;gsub()
/sub()
:替換操作。
示例:替換多個空格為一個空格
gsub("[[:space:]]+", " ", "a cat in a box", perl = TRUE)
## [1] "a cat in a box"
正則表達式具有強大表達能力,在處理網絡抓取文本、自然語言處理等任務中應用廣泛。
參考引用
-
Wickham, H., & Grolemund, G. (2016). R for Data Science. O’Reilly Media.
在線閱讀:https://r4ds.hadley.nz -
R 官方語言手冊
https://cran.r-project.org/manuals.html -
RDocumentation: R 函數與包參考平臺
https://www.rdocumentation.org