前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >R语言数据结构(三)数据框

R语言数据结构(三)数据框

原创
作者头像
单细胞指南
发布2023-08-02 19:01:25
2500
发布2023-08-02 19:01:25
举报
文章被收录于专栏:单细胞生信分析

数据结构是指在计算机中存储和组织数据的方式,不同的数据结构有不同的特点和适用场景。R语言中的常用数据结构,包括向量、矩阵、数组、列表和数据框。关于数据结构的使用,我们将分四篇文章分别介绍每种数据结构的操作方法和代码示例。

为方便大家理解记忆,对每种数据结构的基本操作概括为四大类:

  1. 创建数据结构
  2. 往里面添加数据
  3. 从里面查询数据
  4. 对里面的数据进行修改

这篇文章我们将介绍数据框的使用

数据框

数据框是R语言中的一种类似于表格的数据结构,它是由一系列相同长度的向量组成的有序集合。数据框有两个维度,分别表示行数和列数,可以用dim()函数来获取。数据框中的每个向量可以有一个名称,可以用names()函数来获取或设置。数据框中的每个向量可以是不同的类型,但同一列的元素必须是相同的类型。

创建数据框

创建数据框的一种常用方法是使用data.frame()函数,它可以将多个向量组合成一个数据框。data.frame()函数的参数有:

  • ...: 这些参数可以采用valuetag = 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。

例如:

代码语言:javascript
复制

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()函数来获取和设置。

  • 行名:数据框的每一行都有一个行名,用于标识不同的行。行名是一个字符向量,可以通过row.names()函数获取或设置。
  • 列名:数据框的每一列都有一个列名,用于标识不同的列。列名是一个字符向量,可以通过colnames()函数获取或设置。

下面是一些关于数据框行名和列名的示例代码:

代码语言:javascript
复制
# 创建示例数据框
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开始,表示第一行或第一列,负数表示排除对应位置的元素。名称是指数据框中每个向量的名称,可以用双引号或单引号包围。使用方括号[]访问数据框中的元素时,返回的结果仍然是一个数据框。例如:

代码语言:javascript
复制

# 访问df1数据框中的第一行
df1[1, ]
#    name age gender
# 1 Alice  20      F

# 访问df2数据框中的"score"列
df2["score"]
#         score
# Math       90
# English    80
# History    70

如果想要访问数据框中的元素的值,而不是一个数据框,可以使用双方括号[[]]或者美元符号$。例如:

代码语言:javascript
复制

# 访问df1数据框中的第一行的值
df1[[1]]
#  [1] "Alice" "Bob"   "Charlie"


# 访问df2数据框中的"score"列的值
df2$score
# [1] 90 80 70

如果数据框中的元素是一个向量,可以在双方括号[[]]或者美元符号$后面加上方括号[]和相应的索引号来访问子元素。例如:

代码语言:javascript
复制

# 访问df1数据框中的第一列(一个向量)的第二个子元素
df1[[1]][2]
# [1] "Bob"

# 访问df2数据框中的"grade"列(一个向量)的第三个子元素
df2$grade[3]
# [1] C

修改数据框

修改数据框中的元素可以使用赋值符号<-或者等号=。例如:

代码语言:javascript
复制

# 修改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

为数据框增加一列

代码语言:javascript
复制

# 假设有一个数据框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()函数来按行或列合并数据框,参数是两个或多个数据框,它们必须有相同的列数或行数。例如:

代码语言:javascript
复制
# 创建两个数据框
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语言中删除数据框中的行或列,并在每个操作后注释了相应的输出结果。请注意,这些操作都会生成新的数据框,并不会对原始数据框进行修改。

代码语言:javascript
复制

# 创建示例数据框
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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 数据框
    • 创建数据框
      • 访问数据框
        • 修改数据框
          • 合并数据框
            • 删除数据框
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档