R编程中的数据帧
让我们继续我们的R编程教程系列,了解R中的数据框架。
如果您曾经处理过数据库中的数据,您将熟悉记录的概念。
记录不过是变量的集合。
例如,一个学生记录可以在称为记录的观察中包含学生的卷号,姓名,年龄和性别。
数据库管理系统将这些记录的集合存储为表格。
R具有类似于此类表的结构。
这些被称为数据帧。
与矩阵或者向量不同,数据帧对变量的数据类型没有限制。
每个数据框可以是数字,字符串,因子等的集合。
在R中写入数据帧的唯一规则是所有记录的长度必须相同。
R中的数据帧配备了多种功能,可以处理大量数据以进行统计处理。
让我们开始使用数据帧。
在R编程中创建数据框
可以使用R中的data.frame()函数创建一个数据帧。
此函数可以将任意数量的等长向量作为参数,以及一个可选的参数stringsAsFactors。
我们将很快对此进行讨论。
以下是创建简单数据框的示例。
#Create a string vector to hold the names. > names <- c("Adam","Antony","Brian","Carl","Doug") #Create an integer vector to hold the respective ages. > ages <- c(23,22,24,25,26) #Build a dataframe from the two vectors > playerdata <- data.frame(names,ages,stringsAsFactors = FALSE) #Display the data frame > playerdata names ages 1 Adam 23 2 Antony 22 3 Brian 24 4 Carl 25 5 Doug 26
注意数据帧如何在其结构中同时容纳字符串和关联的整数。
数据框可以具有任意数量的这样的列。
如图所示,R还为数据帧中的每个记录提供唯一的索引号。
参数stringAsFactors设置为FALSE。
否则,R编译器会将每个名称视为特定的分类变量,正如我们在前面的因素教程中所看到的那样。
使用R语言从数据帧访问记录
数据帧的组成部分可以通过索引号或者列名进行访问。
列的索引是使用双方括号符号" "完成的。
当使用名称访问列时,您需要在名称之前加一个美元符号" $"。
> playerdata[[2]] [1] 23 22 24 25 26 > playerdata$names [1] "Adam" "Antony" "Brian" "Carl" "Doug"
当您希望访问特定位置的数据时,例如第四列的第二项,可以通过矩阵索引(如符号)来完成。
让我们来看一个例子。
> playerdata[3,2] [1] 24
您可以使用ncol
,nrow
和dim
函数来验证数据帧的大小。
> names <-c("Akash","Amulya","Raju","Charita","Lokesh","Deepa","Ravi") > sex<-factor(c("M","F","M","F","M","F","M")) > age<-c(23,24,34,30,45,33,25) > emp<-data.frame(names,sex,age, stringsAsFactors = FALSE) > emp names sex age 1 Akash M 23 2 Amulya F 24 3 Raju M 34 4 Charita F 30 5 Lokesh M 45 6 Deepa F 33 7 Ravi M 25 #Check the dimensions of the data frame > dim(emp) [1] 7 3 > nrow(emp) [1] 7 > ncol(emp) [1] 3
在R中扩展数据帧
实时数据通常是动态的。
数据的结构随着新变量的添加而不断变化。
随着进行更多的观察,数据的长度不断变化。
为了适应这些情况,R提供了在数据帧中添加和删除行和列的方法。
让我们尝试将新记录添加到上面创建的" emp"数据框中。
为此,我们首先需要创建要单独添加为数据框的记录。
假设我们需要添加一条记录。
> newdata <-data.frame(names="Indu",sex="F",age=29)
现在,我们将该行添加到已创建的" emp"数据帧中,如下所示。
> emp <- rbind(emp,newdata) > emp names sex age 1 Akash M 23 2 Amulya F 24 3 Raju M 34 4 Charita F 30 5 Lokesh M 45 6 Deepa F 33 7 Ravi M 25 8 Indu F 29
可以通过使用cbind()
函数来向数据帧添加列。
> salary <-c(10000,12000,20000,12000,21000,15000,13000,10000) > emp<-cbind(emp,salary) > emp names sex age salary 1 Akash M 23 10000 2 Amulya F 24 12000 3 Raju M 34 20000 4 Charita F 30 12000 5 Lokesh M 45 21000 6 Deepa F 33 15000 7 Ravi M 25 13000 8 Indu F 29 10000
子集数据框
您可能熟悉使用某些逻辑条件在数据库中查询表的SQL(顺序查询语言)。
R提供类似的功能来查询数据帧并生成较大数据帧的逻辑子集。
假设我希望从" emp"框架中提取属于男性雇员的所有数据记录。
我可以使用以下代码行做到这一点。
> emp[emp$sex=="M",] names sex age salary 1 Akash M 23 10000 3 Raju M 34 20000 5 Lokesh M 45 21000 7 Ravi M 25 13000
" emp $sex =='M`"部分给出布尔值向量,表明特定行的sex值是否为M。
我们使用相同的逻辑布尔向量在emp框架上建立索引。
对于指定类似矩阵的索引,必须使用以下逗号。
逗号前的部分代表行,而逗号后的部分代表列。
由于我们将其留为空白,因此我们只需选择所有列。
我们也可以选择只显示姓名和性别。
> emp[emp$sex=="M",1:2] names sex 1 Akash M 3 Raju M 5 Lokesh M 7 Ravi M
除了提供列的索引号,您还可以提供如下的列名。
> emp[emp$sex=='F',c("names","sex")] names sex 2 Amulya F 4 Charita F 6 Deepa F 8 Indu F
您也可以在索引数据帧时添加逻辑条件。
假设您希望提取所有薪水高于12000的女性雇员的记录。
您可以按照以下步骤进行操作。
> emp[emp$sex=='F'&salary>12000,] names sex age salary 6 Deepa F 33 15000
有用的数据框功能
除了上面列出的实用程序外,在处理数据帧时可能还需要一些方便的功能。
本节列出了其中的一些。
排序数据框
可以使用索引中的顺序功能进行排序。
#Sort by decreasing order of salaries. > emp[order(emp$salary,decreasing = TRUE),] names sex age salary 5 Lokesh M 45 21000 3 Raju M 34 20000 6 Deepa F 33 15000 7 Ravi M 25 13000 2 Amulya F 24 12000 4 Charita F 30 12000 1 Akash M 23 10000 8 Indu F 29 10000 #Sort by ascending alphabetical order of names. > emp[order(emp$names,decreasing = FALSE),] names sex age 1 Akash M 23 2 Amulya F 24 4 Charita F 30 6 Deepa F 33 5 Lokesh M 45 3 Raju M 34 7 Ravi M 25
head()和tail()函数
这些分别用于获取数据帧的前几行或者最后几行。
当您拥有庞大的数据集时,这些功能特别有用。
它们使您可以检查数据的特征,而不必通过显示整个数据集来阻塞内存。
#Get the top 2 rows of the dataset. > head(emp,2) names sex age 1 Akash M 23 2 Amulya F 24 #Get the last 3 rows of the dataset. > tail(emp,3) names sex age 6 Deepa F 33 7 Ravi M 25 8 Indu F 29
默认情况下,head和tail函数获取6行,但未指定任何数字。
合并两个数据框
合并数据帧类似于在表上执行数据库联接。
当在单独的数据帧中有关于数据帧的一列的更多信息可用时,我们可以使用公共列轻松合并这两个列。
例如,请考虑以下情况,我们拥有一些雇员的婚姻状况。
> mar -> data.frame(names=c("Akash","Amulya","Raju","Lokesh","Ravi","Indu"),marital=c("single","married","single","single","single","married"))
现在,我们可以将其与我们的" emp"数据框合并,以获取合并的信息。
> merge(emp,mar,by="names",all=TRUE) names sex age marital 1 Akash M 23 single 2 Amulya F 24 married 3 Charita F 30 <NA> 4 Deepa F 33 <NA> 5 Indu F 29 married 6 Lokesh M 45 single 7 Raju M 34 single 8 Ravi M 25 single
即使我们没有关于某些员工的信息,数据框仍然会填充NA值,以确保顺利合并。