數(shù)據(jù)結(jié)構(gòu)是指在計(jì)算機(jī)中存儲(chǔ)和組織數(shù)據(jù)的方式璧帝,不同的數(shù)據(jù)結(jié)構(gòu)有不同的特點(diǎn)和適用場(chǎng)景。R語言中的常用數(shù)據(jù)結(jié)構(gòu)圾旨,包括向量碌识、矩陣、數(shù)組舰绘、列表和數(shù)據(jù)框蹂喻。關(guān)于數(shù)據(jù)結(jié)構(gòu)的使用葱椭,我們將分四篇文章分別介紹每種數(shù)據(jù)結(jié)構(gòu)的操作方法和代碼示例。
為方便大家理解記憶口四,對(duì)每種數(shù)據(jù)結(jié)構(gòu)的基本操作概括為四大類:
- 創(chuàng)建數(shù)據(jù)結(jié)構(gòu)
- 往里面添加數(shù)據(jù)
- 從里面查詢數(shù)據(jù)
- 對(duì)里面的數(shù)據(jù)進(jìn)行修改
這篇文章我們將介紹數(shù)據(jù)框的使用
數(shù)據(jù)框
數(shù)據(jù)框是R語言中的一種類似于表格的數(shù)據(jù)結(jié)構(gòu)孵运,它是由一系列相同長(zhǎng)度的向量組成的有序集合。數(shù)據(jù)框有兩個(gè)維度蔓彩,分別表示行數(shù)和列數(shù)治笨,可以用dim()
函數(shù)來獲取。數(shù)據(jù)框中的每個(gè)向量可以有一個(gè)名稱赤嚼,可以用names()
函數(shù)來獲取或設(shè)置旷赖。數(shù)據(jù)框中的每個(gè)向量可以是不同的類型,但同一列的元素必須是相同的類型探膊。
創(chuàng)建數(shù)據(jù)框
創(chuàng)建數(shù)據(jù)框的一種常用方法是使用data.frame()
函數(shù)杠愧,它可以將多個(gè)向量組合成一個(gè)數(shù)據(jù)框。data.frame()
函數(shù)的參數(shù)有:
-
...
: 這些參數(shù)可以采用value
或tag = value
的形式逞壁。組件名稱將基于tag
(如果存在)或被解析的參數(shù)本身流济。 -
row.names
: 可以是NULL、單個(gè)整數(shù)或字符字符串腌闯,用于指定用作行名的列绳瘟,或者是字符或整數(shù)向量,提供數(shù)據(jù)框的行名姿骏。 -
check.rows
: 若為TRUE糖声,則會(huì)檢查行的長(zhǎng)度和名稱是否一致。 -
check.names
: 邏輯值分瘦。若為TRUE蘸泻,則會(huì)檢查數(shù)據(jù)框中變量的名稱,以確保它們是符合語法規(guī)范的變量名稱且不重復(fù)嘲玫。必要時(shí)悦施,會(huì)進(jìn)行調(diào)整(通過make.names
函數(shù))。 -
fix.empty.names
: 邏輯值去团,指示是否為“未命名”的參數(shù)(指的是未被正式命名為someName = arg
的參數(shù))自動(dòng)生成一個(gè)名稱抡诞,還是使用名稱""
。即使check.names
為FALSE土陪,如果要保留""
作為名稱昼汗,也需要將此參數(shù)設(shè)置為FALSE。 -
stringsAsFactors
: 邏輯值鬼雀,指定是否將字符向量轉(zhuǎn)換為因子向量顷窒。在R 4.0.0之前,默認(rèn)設(shè)置是TRUE源哩,但現(xiàn)在已更改為FALSE蹋肮。
例如:
df1 <- data.frame(name = c("Alice", "Bob", "Charlie"),
age = c(20, 25, 30),
gender = c("F", "M", "M"))
df1
# name age gender
# 1 Alice 20 F
# 2 Bob 25 M
# 3 Charlie 30 M
# 使用兩個(gè)向量創(chuàng)建一個(gè)數(shù)據(jù)框出刷,并給每行命名
df2 <- data.frame(score = c(90, 80, 70),
grade = c("A", "B", "C"),
row.names = c("Math", "English", "History"))
df2
# score grade
# Math 90 A
# English 80 B
# History 70 C
# 使用兩個(gè)向量創(chuàng)建一個(gè)數(shù)據(jù)框,并不將字符向量轉(zhuǎn)換為因子向量
df3 <- data.frame(color = c("red", "green", "blue"),
code = c("#FF0000", "#00FF00", "#0000FF"),
stringsAsFactors = FALSE)
df3
# color code
# 1 red #FF0000
# 2 green #00FF00
# 3 blue #0000FF
數(shù)據(jù)框有兩個(gè)維度坯辩,即行和列,可以用dim()函數(shù)獲取崩侠。而數(shù)據(jù)框的行名和列名分別對(duì)應(yīng)著數(shù)據(jù)框的行和列的標(biāo)識(shí)符漆魔,可以用row.names()和colnames()函數(shù)來獲取和設(shè)置。
- 行名:數(shù)據(jù)框的每一行都有一個(gè)行名却音,用于標(biāo)識(shí)不同的行改抡。行名是一個(gè)字符向量,可以通過row.names()函數(shù)獲取或設(shè)置系瓢。
- 列名:數(shù)據(jù)框的每一列都有一個(gè)列名阿纤,用于標(biāo)識(shí)不同的列。列名是一個(gè)字符向量夷陋,可以通過colnames()函數(shù)獲取或設(shè)置欠拾。
下面是一些關(guān)于數(shù)據(jù)框行名和列名的示例代碼:
# 創(chuàng)建示例數(shù)據(jù)框
df <- data.frame(
name = c("Alice", "Bob", "Charlie"),
age = c(20, 25, 30),
gender = c("F", "M", "M")
)
df
# name age gender
# 1 Alice 20 F
# 2 Bob 25 M
# 3 Charlie 30 M
# 獲取數(shù)據(jù)框的行名和列名
row_names <- row.names(df)
col_names <- colnames(df)
cat("數(shù)據(jù)框的行名:\n")
row_names
# 輸出:
# 數(shù)據(jù)框的行名:
# [1] "1" "2" "3"
cat("數(shù)據(jù)框的列名:\n")
col_names
# 數(shù)據(jù)框的列名:
# [1] "name" "age" "gender"
# 修改數(shù)據(jù)框的行名和列名
# 設(shè)置新的行名和列名
new_row_names <- c("row1", "row2", "row3")
new_col_names <- c("姓名", "年齡", "性別")
# 使用row.names()和colnames()函數(shù)設(shè)置新的行名和列名
row.names(df) <- new_row_names
colnames(df) <- new_col_names
cat("修改后的數(shù)據(jù)框:\n")
df
# 輸出:
# 修改后的數(shù)據(jù)框:
# 姓名 年齡 性別
# row1 Alice 20 F
# row2 Bob 25 M
# row3 Charlie 30 M
訪問數(shù)據(jù)框
訪問數(shù)據(jù)框中的元素可以使用方括號(hào)[]
和行列索引號(hào)或名稱。行列索引號(hào)從1開始骗绕,表示第一行或第一列藐窄,負(fù)數(shù)表示排除對(duì)應(yīng)位置的元素。名稱是指數(shù)據(jù)框中每個(gè)向量的名稱酬土,可以用雙引號(hào)或單引號(hào)包圍荆忍。使用方括號(hào)[]
訪問數(shù)據(jù)框中的元素時(shí),返回的結(jié)果仍然是一個(gè)數(shù)據(jù)框撤缴。例如:
# 訪問df1數(shù)據(jù)框中的第一行
df1[1, ]
# name age gender
# 1 Alice 20 F
# 訪問df2數(shù)據(jù)框中的"score"列
df2["score"]
# score
# Math 90
# English 80
# History 70
如果想要訪問數(shù)據(jù)框中的元素的值刹枉,而不是一個(gè)數(shù)據(jù)框,可以使用雙方括號(hào)[[]]
或者美元符號(hào)$
屈呕。例如:
# 訪問df1數(shù)據(jù)框中的第一行的值
df1[[1]]
# [1] "Alice" "Bob" "Charlie"
# 訪問df2數(shù)據(jù)框中的"score"列的值
df2$score
# [1] 90 80 70
如果數(shù)據(jù)框中的元素是一個(gè)向量微宝,可以在雙方括號(hào)[[]]
或者美元符號(hào)$
后面加上方括號(hào)[]
和相應(yīng)的索引號(hào)來訪問子元素。例如:
# 訪問df1數(shù)據(jù)框中的第一列(一個(gè)向量)的第二個(gè)子元素
df1[[1]][2]
# [1] "Bob"
# 訪問df2數(shù)據(jù)框中的"grade"列(一個(gè)向量)的第三個(gè)子元素
df2$grade[3]
# [1] C
修改數(shù)據(jù)框
修改數(shù)據(jù)框中的元素可以使用賦值符號(hào)<-
或者等號(hào)=
凉袱。例如:
# 修改df1數(shù)據(jù)框中的第二行為c("David", 28, "M")
df1[2, ] <- c("David", 28, "M")
df1
# name age gender
# 1 Alice 20 F
# 2 David 28 M
# 3 Charlie 30 M
# 修改df2數(shù)據(jù)框中的"grade"列為c("A+", "B+", "C+")
df2["grade"] <- c("A+", "B+", "C+")
df2
# score grade
# Math 90 A+
# English 80 B+
# History 70 C+
# 修改df3數(shù)據(jù)框中的第一行第二列的元素為"#FFFFFF"
df3[1, 2] <- "#FFFFFF"
df3
# color code
# 1 red #FFFFFF
# 2 green #00FF00
為數(shù)據(jù)框增加一列
# 假設(shè)有一個(gè)數(shù)據(jù)框df_add
df_add <- data.frame(name = c("Alice", "Bob", "Charlie"),
age = c(20, 25, 30),
gender = c("F", "M", "M"))
df_add
# name age gender
# 1 Alice 20 F
# 2 Bob 25 M
# 3 Charlie 30 M
# 要增加一列"city"芥吟,包含每個(gè)人對(duì)應(yīng)的城市信息
city <- c("New York", "London", "Tokyo")
# 使用賦值符號(hào)<-給數(shù)據(jù)框增加新列
df_add$city <- city
# 查看增加列后的數(shù)據(jù)框
df_add
# name age gender city
# 1 Alice 20 F New York
# 2 Bob 25 M London
# 3 Charlie 30 M Tokyo
合并數(shù)據(jù)框
我們可以用rbind()
和cbind()
函數(shù)來按行或列合并數(shù)據(jù)框,參數(shù)是兩個(gè)或多個(gè)數(shù)據(jù)框专甩,它們必須有相同的列數(shù)或行數(shù)钟鸵。例如:
# 創(chuàng)建兩個(gè)數(shù)據(jù)框
d1 <- data.frame(name = c("Alice", "Bob"), age = c(20, 21))
d1
# name age
# 1 Alice 20
# 2 Bob 21
d2 <- data.frame(name = c("Charlie", "David"), age = c(22, 23))
d2
# name age
# 1 Charlie 22
# 2 David 23
# 按行合并兩個(gè)數(shù)據(jù)框
d3 <- rbind(d1, d2)
# 查看合并后的數(shù)據(jù)框內(nèi)容
d3
# name age
# 1 Alice 20
# 2 Bob 21
# 3 Charlie 22
# 4 David 23
# 創(chuàng)建兩個(gè)數(shù)據(jù)框
d4 <- data.frame(name = c("Alice", "Bob"), gender = c(TRUE, FALSE))
d4
# name gender
# 1 Alice TRUE
# 2 Bob FALSE
d5 <- data.frame(age = c(20, 21), city = c("New York", "London"))
d5
# age city
# 1 20 New York
# 2 21 London
# 按列合并兩個(gè)數(shù)據(jù)框
d6 <- cbind(d4, d5)
# 查看合并后的數(shù)據(jù)框內(nèi)容
d6
# 輸出結(jié)果
# name gender age city
# 1 Alice TRUE 20 New York
# 2 Bob FALSE 21 London
刪除數(shù)據(jù)框
下面示例代碼展示了如何使用負(fù)數(shù)索引和subset()函數(shù)在R語言中刪除數(shù)據(jù)框中的行或列,并在每個(gè)操作后注釋了相應(yīng)的輸出結(jié)果涤躲。請(qǐng)注意棺耍,這些操作都會(huì)生成新的數(shù)據(jù)框,并不會(huì)對(duì)原始數(shù)據(jù)框進(jìn)行修改种樱。
# 創(chuàng)建示例數(shù)據(jù)框
df <- data.frame(
name = c("Alice", "Bob", "Charlie", "David"),
age = c(20, 25, 30, 28),
gender = c("F", "M", "M", "M")
)
# 輸出原始數(shù)據(jù)框
cat("原始數(shù)據(jù)框:\n")
print(df)
# 原始數(shù)據(jù)框:
# name age gender
# 1 Alice 20 F
# 2 Bob 25 M
# 3 Charlie 30 M
# 4 David 28 M
# 刪除行
# 刪除數(shù)據(jù)框中的第一行
df_deleted_row <- df[-1, ]
cat("刪除第一行后的數(shù)據(jù)框:\n")
print(df_deleted_row)
# 刪除第一行后的數(shù)據(jù)框:
# name age gender
# 2 Bob 25 M
# 3 Charlie 30 M
# 4 David 28 M
# 使用subset函數(shù)根據(jù)條件刪除行(刪除年齡為25歲的行)
df_deleted_age <- subset(df, age != 25)
cat("根據(jù)條件刪除age為25歲的行后的數(shù)據(jù)框:\n")
print(df_deleted_age)
# 根據(jù)條件刪除age為25歲的行后的數(shù)據(jù)框:
# name age gender
# 1 Alice 20 F
# 3 Charlie 30 M
# 4 David 28 M
# 刪除列
# 刪除數(shù)據(jù)框中的gender列
df_deleted_column <- df[, -3]
cat("刪除gender列后的數(shù)據(jù)框:\n")
print(df_deleted_column)
# 刪除gender列后的數(shù)據(jù)框:
# name age
# 1 Alice 20
# 2 Bob 25
# 3 Charlie 30
# 4 David 28
# 使用subset函數(shù)根據(jù)條件刪除列(刪除age列)
df_deleted_age_column <- subset(df, select = -c(age))
cat("根據(jù)條件刪除age列后的數(shù)據(jù)框:\n")
print(df_deleted_age_column)
# 根據(jù)條件刪除age列后的數(shù)據(jù)框:
# name gender
# 1 Alice F
# 2 Bob M
# 3 Charlie M
# 4 David M