R语言基础入门—数据结构(2)

文摘   2024-09-02 09:47   北京  
R语言数据结构包括向量,矩阵和数据框,数组, 列表,因子等,主要是线性代数中的一些概念。

前面我们已经讲了向量、矩阵和数组,今天小编继续介绍剩余的数据结构。

数据框

统计分析中最常见的原始数据形式是类似于数据库表或Excel数据表的形式。这样形式的数据在R中叫做数据框(data.frame)。数据帧是表或二维阵列状结构,其中每一列包含一个变量的值,并且每一行包含来自每一列的一组值。

以下是数据帧的特性。

  • 列名称应为非空。

  • 行名称应该是唯一的。

  • 存储在数据帧中的数据可以是数字,因子或字符类型。

  • 每个列应包含相同数量的数据项。

创建数据框

R 语言的数据框可以使用 data.frame() 函数来创建。

# Create the data frame.emp.data <- data.frame(   emp_id = c (1:5),    emp_name = c("Rick","Dan","Michelle","Ryan","Gary"),   salary = c(623.3,515.2,611.0,729.0,843.25), 
start_date = as.Date(c("2012-01-01", "2013-09-23", "2014-11-15", "2014-05-11", "2015-03-27")), stringsAsFactors = FALSE)# Print the data frame. print(emp.data)
当我们执行上面的代码,它产生以下结果 -
 emp_id    emp_name     salary     start_date1     1     Rick        623.30     2012-01-012     2     Dan         515.20     2013-09-233     3     Michelle    611.00     2014-11-154     4     Ryan        729.00     2014-05-115     5     Gary        843.25     2015-03-27
获取数据框行列信息
通过函数colnames()或names()可获取数据框的列名称,函数rownames()可获取数据框的行名称。
colnames(emp.data)names(emp.data)rownames(emp.data)
当我们执行上面的代码,它产生以下结果 -
[1] "emp_id"     "emp_name"   "salary"     "start_date"[1] "emp_id"     "emp_name"   "salary"     "start_date"[1] "1" "2" "3" "4" "5"
通过函数nrow()或函数ncol(),可获取数据框的行数或列数。
nrow(emp.data)ncol(emp.data)
当我们执行上面的代码,它产生以下结果 -
[1] 5[1] 
获取数据框的结构
通过使用str()函数可以看到数据帧的结构。
# Create the data frame.emp.data <- data.frame(   emp_id = c (1:5),    emp_name = c("Rick","Dan","Michelle","Ryan","Gary"),   salary = c(623.3,515.2,611.0,729.0,843.25), 
start_date = as.Date(c("2012-01-01", "2013-09-23", "2014-11-15", "2014-05-11", "2015-03-27")), stringsAsFactors = FALSE)# Get the structure of the data frame.str(emp.data)
当我们执行上面的代码,它产生以下结果 -
'data.frame':   5 obs. of  4 variables: $ emp_id    : int  1 2 3 4 5 $ emp_name  : chr  "Rick" "Dan" "Michelle" "Ryan" ... $ salary    : num  623 515 611 729 843 $ start_date: Date, format: "2012-01-01" "2013-09-23" "2014-11-15" "2014-05-11" ..
从数据框提取数据
使用列名称从数据框中提取特定列。
# Create the data frame.emp.data <- data.frame(   emp_id = c (1:5),   emp_name = c("Rick","Dan","Michelle","Ryan","Gary"),   salary = c(623.3,515.2,611.0,729.0,843.25),
start_date = as.Date(c("2012-01-01","2013-09-23","2014-11-15","2014-05-11", "2015-03-27")), stringsAsFactors = FALSE)# Extract Specific columns.result <- data.frame(emp.data$emp_name,emp.data$salary)print(result)
当我们执行上面的代码,它产生以下结果 -
  emp.data.emp_name emp.data.salary1              Rick          623.302               Dan          515.203          Michelle          611.004              Ryan          729.005              Gary          843.25
先提取前两行,然后提取所有列
# Create the data frame.emp.data <- data.frame(   emp_id = c (1:5),   emp_name = c("Rick","Dan","Michelle","Ryan","Gary"),   salary = c(623.3,515.2,611.0,729.0,843.25),
start_date = as.Date(c("2012-01-01", "2013-09-23", "2014-11-15", "2014-05-11", "2015-03-27")), stringsAsFactors = FALSE)# Extract first two rows.result <- emp.data[1:2,]print(result)

当我们执行上面的代码,它产生以下结果 
  emp_id    emp_name   salary    start_date1      1     Rick      623.3     2012-01-012      2     Dan       515.2     2013-09-23

用第2和第4列提取第3和第5行

# Create the data frame.emp.data <- data.frame( emp_id = c (1:5), emp_name = c("Rick","Dan","Michelle","Ryan","Gary"), salary = c(623.3,515.2,611.0,729.0,843.25),
start_date = as.Date(c("2012-01-01", "2013-09-23", "2014-11-15", "2014-05-11", "2015-03-27")), stringsAsFactors = FALSE)
# Extract 3rd and 5th row with 2nd and 4th column.result <- emp.data[c(3,5),c(2,4)]print(result)

当我们执行上面的代码,它产生以下结果 -
  emp_name start_date3 Michelle 2014-11-155     Gary 2015-03-27
扩展数据框

可以通过添加列和行来扩展数据帧。

添加列

只需使用新的列名称添加列向量。

# Create the data frame.emp.data <- data.frame(   emp_id = c (1:5),    emp_name = c("Rick","Dan","Michelle","Ryan","Gary"),   salary = c(623.3,515.2,611.0,729.0,843.25), 
start_date = as.Date(c("2012-01-01", "2013-09-23", "2014-11-15", "2014-05-11", "2015-03-27")), stringsAsFactors = FALSE)
# Add the "dept" coulmn.emp.data$dept <- c("IT","Operations","IT","HR","Finance")v <- emp.dataprint(v)

当我们执行上面的代码,它产生以下结果 -

  emp_id   emp_name    salary    start_date       dept1     1    Rick        623.30    2012-01-01       IT2     2    Dan         515.20    2013-09-23       Operations3     3    Michelle    611.00    2014-11-15       IT4     4    Ryan        729.00    2014-05-11       HR5     5    Gary        843.25    2015-03-27       Finance

添加行

要将更多行永久添加到现有数据帧,我们需要引入与现有数据帧相同结构的新行,并使用rbind()函数。
在下面的示例中,我们创建一个包含新行的数据帧,并将其与现有数据帧合并以创建最终数据帧。

# Create the first data frame.emp.data <- data.frame(   emp_id = c (1:5),    emp_name = c("Rick","Dan","Michelle","Ryan","Gary"),   salary = c(623.3,515.2,611.0,729.0,843.25), 
start_date = as.Date(c("2012-01-01", "2013-09-23", "2014-11-15", "2014-05-11", "2015-03-27")), dept = c("IT","Operations","IT","HR","Finance"), stringsAsFactors = FALSE)
# Create the second data frameemp.newdata <- data.frame( emp_id = c (6:8), emp_name = c("Rasmi","Pranab","Tusar"), salary = c(578.0,722.5,632.8), start_date = as.Date(c("2013-05-21","2013-07-30","2014-06-17")), dept = c("IT","Operations","Fianance"), stringsAsFactors = FALSE)
# Bind the two data frames.emp.finaldata <- rbind(emp.data,emp.newdata)print(emp.finaldata)

当我们执行上面的代码,它产生以下结果 

  emp_id     emp_name    salary     start_date       dept1      1     Rick        623.30     2012-01-01       IT2      2     Dan         515.20     2013-09-23       Operations3      3     Michelle    611.00     2014-11-15       IT4      4     Ryan        729.00     2014-05-11       HR5      5     Gary        843.25     2015-03-27       Finance6      6     Rasmi       578.00     2013-05-21       IT7      7     Pranab      722.50     2013-07-30       Operations8      8     Tusar       632.80     2014-06-17       Fianance

因子

在R语言当中有因子这个特殊的数据结构,和别的编程语言不同,这个数据结构的主要目的是用来分类,计算频数和频率,在后期将R语言用于统计学当中将会十分受用。并且在绘图当中,我们使用同样的数据,将其转化为因子之后,在将这些数据放入绘制图像的函数当中,图像将会变得更加具有可读性。

创建因子

使用factor()函数通过将向量作为输入创建因子。

# Create a vector as input.data <- c("East","West","East","North","North","East","West","West","West","East","North")
print(data)print(is.factor(data))
# Apply the factor function.factor_data <- factor(data)
print(factor_data)print(is.factor(factor_data))

当我们执行上面的代码,它产生以下结果 :

 [1] "East"  "West"  "East"  "North" "North" "East"  "West"  "West"  "West"  "East" "North"[1] FALSE [1] East  West  East  North North East  West  West  West  East  NorthLevels: East North West[1] TRUE

其次,在创建具有文本数据列的任何数据框时,R语言将文本列视为分类数据并在其上创建因子。

# Create the vectors for data frame.height <- c(132,151,162,139,166,147,122)weight <- c(48,49,66,53,67,52,40)gender <- c("male","male","female","female","male","female","male")
# Create the data frame.input_data <- data.frame(height,weight,gender)print(input_data)
# Test if the gender column is a factor.print(is.factor(input_data$gender))
# Print the gender column so see the levels.print(input_data$gender)

当我们执行上面的代码,它产生以下结果:

  height weight gender1    132     48   male2    151     49   male3    162     66 female4    139     53 female5    166     67   male6    147     52 female7    122     40   male[1] TRUE[1] male   male   female female male   female male  Levels: female male
更改级别顺序
可以通过使用新的等级次序再次应用因子函数来改变因子中的等级的顺序。
data <- c("East","West","East","North","North","East","West","West","West","East","North")# Create the factorsfactor_data <- factor(data)print(factor_data)
# Apply the factor function with required order of the level.new_order_data <- factor(factor_data,levels = c("East","West","North"))print(new_order_data)

当我们执行上面的代码,它产生以下结果:

 [1] East  West  East  North North East  West  West  West  East  NorthLevels: East North West [1] East  West  East  North North East  West  West  West  East  NorthLevels: East West North
生成因子级别
我们可以使用gl()函数生成因子级别。它需要两个整数作为输入,指示每个级别有多少级别和多少次。

语法

gl(n, k, labels)

以下是所使用的参数的说明 -

  • n是给出级数的整数。

  • k是给出复制数目的整数。

  • labels是所得因子水平的标签向量。

v <- gl(3, 4, labels = c("Tampa", "Seattle","Boston"))print(v)

当我们执行上面的代码,它产生以下结果:

Tampa   Tampa   Tampa   Tampa   Seattle Seattle Seattle Seattle Boston [10] Boston  Boston  Boston Levels: Tampa Seattle Boston

列表

列表是 R 语言的对象集合,可以用来保存不同类型的数据,可以是数字、字符串、向量、另一个列表、矩阵、数据框等,当然还可以包含矩阵和函数。列表是一种灵活的数据结构,可以存储和操作多种类型的数据对象。

创建列表

R 语言创建列表使用 list() 函数。如下实例,我们创建一个列表,包含了字符串、向量和数字:

list_data <- list("runoob", "google", c(11,22,33), 123, 51.23, 119.1)print(list_data)

执行以上代码输出结果为:

[[1]][1] "runoob"
[[2]][1] "google"
[[3]][1] 11 22 33
[[4]][1] 123
[[5]][1] 51.23
[[6]][1] 119.1

我们可以使用 names() 函数给列表的元素命名:

# 列表包含向量、矩阵、列表list_data <- list(c("Google","Runoob","Taobao"), matrix(c(1,2,3,4,5,6), nrow = 2),   list("runoob",12.3))
# 给列表元素设置名字names(list_data) <- c("Sites", "Numbers", "Lists")
# 显示列表print(list_data)

执行以上代码输出结果为:

$Sites[1] "Google" "Runoob" "Taobao"
$Numbers [,1] [,2] [,3][1,] 1 3 5[2,]    2    4    6
$Lists$Lists[[1]][1] "runoob"
$Lists[[2]][1] 12.3

访问列表

列表中的元素可以使用索引来访问,如果使用来 names() 函数命名后,我们还可以使用对应名字来访问:

# 列表包含向量、矩阵、列表list_data <- list(c("Google","Runoob","Taobao"), matrix(c(1,2,3,4,5,6), nrow = 2),   list("runoob",12.3))
# 给列表元素设置名字names(list_data) <- c("Sites", "Numbers", "Lists")
# 显示列表print(list_data[1])
# 访问列表的第三个元素print(list_data[3])
# 访问第一个向量元素print(list_data$Numbers)

执行以上代码输出结果为:

$Sites[1"Google" "Runoob" "Taobao"
$Lists$Lists[[1]][1"runoob"
$Lists[[2]][112.3
[,1] [,2] [,3][1,] 1 3 5[2,] 2 4 6

操作列表元素

我们可以对列表进行添加、删除、更新的操作,如下实例:

# 列表包含向量、矩阵、列表list_data <- list(c("Google","Runoob","Taobao"), matrix(c(1,2,3,4,5,6), nrow = 2),   list("runoob",12.3))
# 给列表元素设置名字names(list_data) <- c("Sites", "Numbers", "Lists")
# 添加元素list_data[4] <- "新元素"print(list_data[4])
# 删除元素list_data[4] <- NULL
# 删除后输出为 NULLprint(list_data[4])
# 更新元素list_data[3] <- "我替换来第三个元素"print(list_data[3])

执行以上代码输出结果为:

[[1]][1"新元素"
$<NA>NULL
$Lists[1] "我替换来第三个元素"

使用 for 循环遍历列表时:

# 创建一个包含数字和字符的列表my_list <- list(1, 2, 3, "a", "b", "c")

# 使用 for 循环遍历列表中的每个元素for (element in my_list) { print(element)}

在以上代码中,for 循环会依次遍历列表 my_list 中的每个元素,并将每个元素存储在变量 element 中。然后,我们可以在循环体内对每个元素执行特定的操作,例如使用 print() 函数打印元素的值。

for 循环遍历列表时,每次循环都将当前元素赋值给变量 element。因此,在循环体内可以对 element 进行任何需要的操作,例如计算、条件判断等。

需要注意的是,使用 for 循环遍历列表时,循环变量 element 将依次取到列表中的每个元素,但不能直接修改列表元素本身。如果需要修改列表中的元素值,可以通过索引来实现,例如 my_list[[index]] <- new_value。

执行以上代码输出结果为:

[1] 1[1] 2[1] 3[1] "a"[1] "b"[1] "c"

合并列表

我们可以使用 c() 函数将多个列表合并为一个列表:

# 创建两个列表list1 <- list(1,2,3)list2 <- list("Google","Runoob","Taobao")

# 合并列表merged.list <- c(list1,list2)

# 显示合并后的列表print(merged.list)

执行以上代码输出结果为:

[[1]][1] 1
[[2]][1] 2
[[3]][1] 3
[[4]][1] "Google"
[[5]][1] "Runoob"
[[6]][1] "Taobao"

列表转换为向量

要将列表转换为向量可以使用 unlist() 函数,将列表转换为向量,可以方便我们进行算术运算:

# 创建列表list1 <- list(1:5)print(list1)
list2 <-list(10:14)print(list2)
# 转换为向量v1 <- unlist(list1)v2 <- unlist(list2)
print(v1)print(v2)
# 两个向量相加result <- v1+v2print(result)

执行以上代码输出结果为:

[[1]][1] 1 2 3 4 5
[[1]][1] 10 11 12 13 14
[1] 1 2 3 4 5[1] 10 11 12 13 14[1] 11 13 15 17 19

好了,由于篇幅原因小编就先给大家介绍到这里下期我们会继续介绍剩余的数据结构希望对您的科研能有所帮助!祝您工作生活顺心快乐!


更多生信课程:


生信课堂
生信笔记
 最新文章