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_date 1 1 Rick 623.30 2012-01-01 2 2 Dan 515.20 2013-09-23 3 3 Michelle 611.00 2014-11-15 4 4 Ryan 729.00 2014-05-11 5 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.salary 1 Rick 623.30 2 Dan 515.20 3 Michelle 611.00 4 Ryan 729.00 5 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_date 1 1 Rick 623.3 2012-01-01 2 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_date 3 Michelle 2014-11-15 5 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 dept 1 1 Rick 623.30 2012-01-01 IT 2 2 Dan 515.20 2013-09-23 Operations 3 3 Michelle 611.00 2014-11-15 IT 4 4 Ryan 729.00 2014-05-11 HR 5 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 frame emp.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 dept 1 1 Rick 623.30 2012-01-01 IT 2 2 Dan 515.20 2013-09-23 Operations 3 3 Michelle 611.00 2014-11-15 IT 4 4 Ryan 729.00 2014-05-11 HR 5 5 Gary 843.25 2015-03-27 Finance 6 6 Rasmi 578.00 2013-05-21 IT 7 7 Pranab 722.50 2013-07-30 Operations 8 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 North Levels: 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 gender 1 132 48 male 2 151 49 male 3 162 66 female 4 139 53 female 5 166 67 male 6 147 52 female 7 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 factors factor_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 North Levels: East North West [1] East West East North North East West West West East North Levels: 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]] [1] 12.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
# 删除后输出为 NULL print(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+v2 print(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
好了,由于篇幅原因小编就先给大家介绍到这里,下期我们会继续介绍剩余的数据结构。希望对您的科研能有所帮助!祝您工作生活顺心快乐!
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!