数据框也是R语言的一种数据结构,比矩阵应用更为广泛。数据框包括行、列数据,可以有多种数据类型,如图4.44所示。数据框具有以下特点。
(1)每列都有一个唯一的列名称,同列数据要求类型一致,不同列数据的类型可以不同。
(2)行名称应该是唯一的。
(3)存储在数据框中的数据可以是字符型、数值型或逻辑型。
图4.44 数据框示意图
使用data.frame()函数创建数据框,语法格式如下:
data.frame(…,row.names = NULL,check.rows = FALSE,check.names = TRUE, fix.empty.names = TRUE,stringsAsFactors = default.stringsAsFactors())
参数说明如下。
…:列向量,可以是任何类型(字符型、数值型、逻辑型),一般以tag = value的形式表示,也可以是value。
row.names:行名,默认为NULL,可以设置为单个数字、字符串或字符串和数字的向量。
check.rows:检测行的名称和长度是否一致。
check.names:检测数据框的变量名是否合法。
fix.empty.names:检查未命名的参数是否自动设置名字。
stringsAsFactors:布尔值,字符是否转换为因子。
首先创建向量,然后使用data.frame()函数创建数据框。
【例4.11】 创建一个简单的数据框 (实例位置:资源包\Code\04\11)
使用data.frame()函数创建一个学生成绩表,运行RStudio,编写如下代码。
1 # 创建数据框 2 df = data.frame( 3 姓名 = c("甲", "乙","丙","丁"), 4 数学 = c(145,101,78,65), 5 语文 = c(100, 120,132,110), 6 英语 = c(100,80,76,91) 7 ) 8 print(df)
运行程序,结果如图4.45所示。
R语言提供了读取各种文件返回数据框的函数,如文本文件、Excel文件、数据库中的数据、SPSS文件、SAS文件等。
【例4.12】 使用read.table()函数读取文本文件 (实例位置:资源包\Code\04\12)
使用read.table()函数读取“1月.txt”文本文件。运行RStudio,编写如下代码。
1 setwd("D:/R程序/RProjects/Code") # 设置工程路径 2 df <- read.table("datas/1月.txt") # 读取文本文件 3 head(df) # 输出前6条数据
运行程序,结果如图4.46所示。
图4.45 学生成绩表
图4.46 读取文本文件
说明
关于读取各种文件的详细介绍参见第7章。
获取例4.11中的列名,示例代码如下:
names(df) # 返回列名 colnames(df) # 返回列名
运行程序,结果如下:
[1] "姓名" "数学" "语文" "英语" [1] "姓名" "数学" "语文" "英语"
修改第4列的列名为“外语”,示例代码如下:
names(df)[4] <- '外语' # 修改第4列的列名 print(df)
运行程序,结果如图4.47所示。
图4.47 修改列名
获取例4.11中的行名,示例代码如下:
row.names(df) # 返回行名 rownames(df) # 返回行名
运行程序,结果如下:
[1] "1" "2" "3" "4" [1] "1" "2" "3" "4"
修改行名的示例代码如下:
rownames(df)= c("r1","r2","r3","r4") # 修改行名 print(df)
运行程序,结果如图4.48所示。
图4.48 修改行名
dimnames(df) # 查看行名和列名
运行程序,结果如下:
[[1]] [1] "1" "2" "3" "4" [[2]] [1] "姓名" "数学" "语文" "英语"
获取行、列信息的示例代码如下:
nrow(df) # 返回行数 ncol(df) # 返回列数 dim(df) # 返回行列数
运行程序,结果如下:
[1] 4 [1] 4 [1] 4 4
获取数据框结构信息的示例代码如下:
str(df)
运行程序,结果如图4.49所示。
图4.49 获取数据框结构信息
显示数据框数据的示例代码如下:
head(df) # 默认返回前6行数据 head(df,2) # 返回前2行数据 tail(df) # 默认返回最后6行数据 tail(df,2) # 返回最后2行数据
运行程序,结果如图4.50所示。
图4.50 显示数据框数据
通过指定列名可获取数据框中指定的数据。
【例4.13】 获取数据框中指定列的数据 (实例位置:资源包\ Code\04\13)
获取“姓名”和“数学”成绩。运行RStudio,新建一个R Script脚本文件,编写如下代码。
运行程序,结果如图4.51所示。
图4.51 获取数据框中指定列的数据
说明
上述代码中的“$”是S3类(R语言的类)的引用方式,比较常用,通常用于获取数据框、列表和向量中的某个变量,例如data1$姓名。
使用下标可以获取数据框中指定行列的元素。如使用x[i,j]可获取第i行第j列的数据。
【例4.14】 获取数据框中指定行列的元素 (实例位置:资源包\Code\04\14)
下面获取数据框中指定行列的数据。运行RStudio,编写如下代码。
运行程序,结果如图4.52所示。
图4.52 获取数据框中指定行列的数据
假设原始数据如图4.53所示,下面介绍如何增加一列数据或增加一行数据。
1)增加一列数据
增加一列数据有两种方法:一是为指定列直接赋值;二是使用cbind()函数,按列合并数据。
【例4.15】 增加一列“物理”成绩 (实例位置:资源包\Code\04\15)
增加一列“物理”成绩,运行RStudio,编写如下代码。
运行程序,结果如图4.54所示。
【例4.16】 使用cbind()函数增加一列数据 (实例位置:资源包\Code\04\16)
下面使用cbind()函数增加一列“物理”成绩,运行RStudio,主要代码如下:
1 df2 <- cbind(df1,物理=c(88,79,60,50)) # 增加一列物理 2 print(df2)
2)增加一行数据
增加一行数据主要使用rbind()函数,需要注意的是,数据列名要一致且列数相同,否则报错。
【例4.17】 在成绩表中增加一行数据 (实例位置:资源包\Code\04\17)
在成绩表中增加一行数据,即“戊”同学的成绩,运行RStudio,主要代码如下:
1 row <- c("戊",100,120,99) # 创建向量 2 df2 <- rbind(df1,row) # 增加一行 3 print(df2)
运行程序,结果如图4.55所示。
图4.53 原始数据
图4.54 增加一列物理成绩
图4.55 在成绩表中增加一行数据
删除数据框中的数据与删除向量元素的方法相同,同样是采用负整数索引的方式将不需要的数据排除在外。
例如,删除第一行“甲”同学的成绩,输出剩余同学的成绩,示例代码如下:
df <- df[-1,]
例如,删除第二列“数学”,示例代码如下:
df <- df[,-2]
修改数据框中的数据与矩阵的修改类似,首先找到索引位置,然后利用赋值语句进行修改。
【例4.18】 修改学生成绩数据 (实例位置:资源包\Code\04\18)
(1)修改整行数据。如修改“甲”同学的各科成绩,示例代码如下:
df[1,2:4] <- c(120,115,109)
如果各科成绩均加10分,则可以直接在原有值加10,示例代码如下:
df[1,2:4] <- df[1,2:4]+10
(2)修改整列数据。如修改所有同学的“语文”成绩,示例代码如下:
df[,"语文"] <- c(115,108,112,118)
(3)修改某一数据。如修改“甲”同学的“语文”成绩,示例代码如下:
df[1,"语文"] <- 115
查询数据框中数据的方法有很多,下面分别进行介绍。
1)which()函数
which()函数可以查找特定的元素,并返回其在数据中的索引,因此在向量、矩阵、数据框、列表等数据结构中有着重要的作用。
如查询数学成绩大于100的数据,示例代码如下:
which(df$数学 > 100)
运行程序,结果如下:
[1] 1 2
这个结果返回的是索引位置。要想返回数据框,示例代码如下:
df[which(df$数学 > 100),]
运行程序,结果如下:
姓名 数学 语文 英语 1 甲 145 100 100 2 乙 101 120 80
2)subset()函数
subset()函数用于从某个数据框中筛选符合条件的数据或列。
(1)单条件查询。如查询性别为女的数据,示例代码如下:
result<-subset(df,性别=="女")
(2)指定显示列。如查询性别为女,仅显示数学一列,示例代码如下:
result<-subset(df,性别=="女",select=c(数学))
(3)多条件查询。如查询性别为女并且数学成绩大于120的数据,示例代码如下:
result<-subset(df,性别=="女" & 数学>120,select=c(数学))
3)SQL语句
在R语言中,安装第三方sqldf包后,还可以使用SQL语句实现数据查询。
安装sqldf包的方法:在RStudio资源管理窗口中选择Packages,进入Install Packages窗口,输入包名sqldf,单击Install按钮,下载并安装sqldf包。
【例4.19】 使用SQL语句查询学生成绩数据 (实例位置:资源包\Code\04\19)
下面通过sqldf包使用SQL语句查询学生成绩数据,运行RStudio,编写如下代码。
运行程序,结果如图4.56所示。
图4.56 使用SQL语句查询学生成绩数据