数据结构是指在计算机中存储和组织数据的方式,不同的数据结构有不同的特点和适用场景。R语言中的常用数据结构,包括向量、矩阵、数组、列表和数据框。关于数据结构的使用,我们将分四篇文章分别介绍每种数据结构的操作方法和代码示例。
为方便大家理解记忆,对每种数据结构的基本操作概括为四大类:
这篇文章我们将介绍数据框的使用
数据框是R语言中的一种类似于表格的数据结构,它是由一系列相同长度的向量组成的有序集合。数据框有两个维度,分别表示行数和列数,可以用dim()
函数来获取。数据框中的每个向量可以有一个名称,可以用names()
函数来获取或设置。数据框中的每个向量可以是不同的类型,但同一列的元素必须是相同的类型。
创建数据框的一种常用方法是使用data.frame()
函数,它可以将多个向量组合成一个数据框。data.frame()
函数的参数有:
...
: 这些参数可以采用value
或tag = value
的形式。组件名称将基于tag
(如果存在)或被解析的参数本身。row.names
: 可以是NULL、单个整数或字符字符串,用于指定用作行名的列,或者是字符或整数向量,提供数据框的行名。check.rows
: 若为TRUE,则会检查行的长度和名称是否一致。check.names
: 逻辑值。若为TRUE,则会检查数据框中变量的名称,以确保它们是符合语法规范的变量名称且不重复。必要时,会进行调整(通过make.names
函数)。fix.empty.names
: 逻辑值,指示是否为“未命名”的参数(指的是未被正式命名为someName = arg
的参数)自动生成一个名称,还是使用名称""
。即使check.names
为FALSE,如果要保留""
作为名称,也需要将此参数设置为FALSE。stringsAsFactors
: 逻辑值,指定是否将字符向量转换为因子向量。在R 4.0.0之前,默认设置是TRUE,但现在已更改为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
# 使用两个向量创建一个数据框,并给每行命名
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
# 使用两个向量创建一个数据框,并不将字符向量转换为因子向量
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
数据框有两个维度,即行和列,可以用dim()函数获取。而数据框的行名和列名分别对应着数据框的行和列的标识符,可以用row.names()和colnames()函数来获取和设置。
下面是一些关于数据框行名和列名的示例代码:
# 创建示例数据框
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
# 获取数据框的行名和列名
row_names <- row.names(df)
col_names <- colnames(df)
cat("数据框的行名:\n")
row_names
# 输出:
# 数据框的行名:
# [1] "1" "2" "3"
cat("数据框的列名:\n")
col_names
# 数据框的列名:
# [1] "name" "age" "gender"
# 修改数据框的行名和列名
# 设置新的行名和列名
new_row_names <- c("row1", "row2", "row3")
new_col_names <- c("姓名", "年龄", "性别")
# 使用row.names()和colnames()函数设置新的行名和列名
row.names(df) <- new_row_names
colnames(df) <- new_col_names
cat("修改后的数据框:\n")
df
# 输出:
# 修改后的数据框:
# 姓名 年龄 性别
# row1 Alice 20 F
# row2 Bob 25 M
# row3 Charlie 30 M
访问数据框中的元素可以使用方括号[]
和行列索引号或名称。行列索引号从1开始,表示第一行或第一列,负数表示排除对应位置的元素。名称是指数据框中每个向量的名称,可以用双引号或单引号包围。使用方括号[]
访问数据框中的元素时,返回的结果仍然是一个数据框。例如:
# 访问df1数据框中的第一行
df1[1, ]
# name age gender
# 1 Alice 20 F
# 访问df2数据框中的"score"列
df2["score"]
# score
# Math 90
# English 80
# History 70
如果想要访问数据框中的元素的值,而不是一个数据框,可以使用双方括号[[]]
或者美元符号$
。例如:
# 访问df1数据框中的第一行的值
df1[[1]]
# [1] "Alice" "Bob" "Charlie"
# 访问df2数据框中的"score"列的值
df2$score
# [1] 90 80 70
如果数据框中的元素是一个向量,可以在双方括号[[]]
或者美元符号$
后面加上方括号[]
和相应的索引号来访问子元素。例如:
# 访问df1数据框中的第一列(一个向量)的第二个子元素
df1[[1]][2]
# [1] "Bob"
# 访问df2数据框中的"grade"列(一个向量)的第三个子元素
df2$grade[3]
# [1] C
修改数据框中的元素可以使用赋值符号<-
或者等号=
。例如:
# 修改df1数据框中的第二行为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数据框中的"grade"列为c("A+", "B+", "C+")
df2["grade"] <- c("A+", "B+", "C+")
df2
# score grade
# Math 90 A+
# English 80 B+
# History 70 C+
# 修改df3数据框中的第一行第二列的元素为"#FFFFFF"
df3[1, 2] <- "#FFFFFF"
df3
# color code
# 1 red #FFFFFF
# 2 green #00FF00
为数据框增加一列
# 假设有一个数据框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",包含每个人对应的城市信息
city <- c("New York", "London", "Tokyo")
# 使用赋值符号<-给数据框增加新列
df_add$city <- city
# 查看增加列后的数据框
df_add
# name age gender city
# 1 Alice 20 F New York
# 2 Bob 25 M London
# 3 Charlie 30 M Tokyo
我们可以用rbind()
和cbind()
函数来按行或列合并数据框,参数是两个或多个数据框,它们必须有相同的列数或行数。例如:
# 创建两个数据框
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
# 按行合并两个数据框
d3 <- rbind(d1, d2)
# 查看合并后的数据框内容
d3
# name age
# 1 Alice 20
# 2 Bob 21
# 3 Charlie 22
# 4 David 23
# 创建两个数据框
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
# 按列合并两个数据框
d6 <- cbind(d4, d5)
# 查看合并后的数据框内容
d6
# 输出结果
# name gender age city
# 1 Alice TRUE 20 New York
# 2 Bob FALSE 21 London
下面示例代码展示了如何使用负数索引和subset()函数在R语言中删除数据框中的行或列,并在每个操作后注释了相应的输出结果。请注意,这些操作都会生成新的数据框,并不会对原始数据框进行修改。
# 创建示例数据框
df <- data.frame(
name = c("Alice", "Bob", "Charlie", "David"),
age = c(20, 25, 30, 28),
gender = c("F", "M", "M", "M")
)
# 输出原始数据框
cat("原始数据框:\n")
print(df)
# 原始数据框:
# name age gender
# 1 Alice 20 F
# 2 Bob 25 M
# 3 Charlie 30 M
# 4 David 28 M
# 删除行
# 删除数据框中的第一行
df_deleted_row <- df[-1, ]
cat("删除第一行后的数据框:\n")
print(df_deleted_row)
# 删除第一行后的数据框:
# name age gender
# 2 Bob 25 M
# 3 Charlie 30 M
# 4 David 28 M
# 使用subset函数根据条件删除行(删除年龄为25岁的行)
df_deleted_age <- subset(df, age != 25)
cat("根据条件删除age为25岁的行后的数据框:\n")
print(df_deleted_age)
# 根据条件删除age为25岁的行后的数据框:
# name age gender
# 1 Alice 20 F
# 3 Charlie 30 M
# 4 David 28 M
# 删除列
# 删除数据框中的gender列
df_deleted_column <- df[, -3]
cat("删除gender列后的数据框:\n")
print(df_deleted_column)
# 删除gender列后的数据框:
# name age
# 1 Alice 20
# 2 Bob 25
# 3 Charlie 30
# 4 David 28
# 使用subset函数根据条件删除列(删除age列)
df_deleted_age_column <- subset(df, select = -c(age))
cat("根据条件删除age列后的数据框:\n")
print(df_deleted_age_column)
# 根据条件删除age列后的数据框:
# name gender
# 1 Alice F
# 2 Bob M
# 3 Charlie M
# 4 David M
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。