一、R语言—数据集创建
1. 向量
向量(vector)是用于存储数值型、字符型、逻辑型数据的一维数组。标量可以看作是 只含有一个元素的向量。
函数c( )可用来创建向量,例如:
x1 <- c(2, 4, 1, -2, 5)
x2 <- c("one", "two", "three")
x3 <- c(TRUE, FALSE, TRUE, FALSE)
这里 x1 是数值型向量,x2 是字符型向量,而 x3 是逻辑型向量。每一个向量中的数据类型必须一致。
如果想创建有规律的向量,R 提供了一些简便的操作和函数,例如:
x4 <- 1:5 # 等价于x4 <- c(1, 2, 3, 4, 5)
x5 <- seq(from = 2, to = 10, by = 2) # 等价于x5 <- c(2, 4, 6, 8, 10)
x6 <- rep("a", times = 4) # 等价于x6 <- c("a", "a", "a", "a")
有时候我们只想使用向量中的某个部分,即选取向量的子集。
假设有一个从 3 到 100 的步长为 7 的整数向量,那么第5 个数的值是多少呢?
x <- seq(from = 3, to = 100, by = 7)
x
2. 因子
一般来说,变量有数值型、名义型和有序型之分。名义型变量是没有顺序关系的分类变量,例如人的性别、血型、民族等。而有序型变量是有层级和顺序关系的分类变量,如患者的病情(较差、好转、很好)。名义型变量和有序型变量在 R 中称为因子(factor)。 因子在 R 中非常重要,它决定了数据的展示和分析方式。数据存储时因子经常以整数向量形式存储。
所以在进行数据分析之前,经常需要将它们用函数 factor( )
转换为因子。例如:
sex <- c(1, 2, 1, 1, 2, 1, 2)
sex.f <- factor(sex,
levels = c(1, 2),
labels = c("Male", "Female"))
sex.f
上面的命令先定义了一个变量 sex 表示性别,假设其取值 1 表示男性,2 表示女性。接着用函数 factor( ) 将变量 sex 转换成了因子并存为对象 sex.f,其中参数 levels 表示原变量的分类标签值,参数 labels 表示因子取值的标签。注意,这两个参数在赋值时需要一一对应,R 会将它们相关联。因子型变量与一般的字符型变量的区别就是它有一个水平(level)属性。
因子的属性可以使用函数 levels( )
查看:
levels(sex.f)
改变因子水平的排列顺序 → 改变参考组
在统计模型中,对于因子型变量,R 会将其第一个水平当作参考组。很多时候我们需要改变因子水平的排列顺序以改变参考组,这可以通过两种方法实现。
第一种方法是在函数 factor( ) 中改变参数 levels 和 labels 的排列顺序,例如:
sex.f1 <- factor(sex, levels = c(2, 1), labels = c("Female", "Male"))
sex.f1
第二种方法是使用函数 relevel( )
:
sex.f1 <- relevel(sex.f, ref = "Female")
sex.f1
有序因子:ordered = TRUE
要表示有序因子,需要在函数 factor ( ) 里指定参数ordered = TRUE。例如:
status <- c(1, 2, 2, 3, 1, 2, 2)
status.f <- factor(
status,
levels = c(1, 2, 3),
labels = c("Poor", "Improved", "Excellent"),
ordered = TRUE
)
status.f
7. 数据类型的转换:is.、as.
在进行数据分析时,分析者需要对数据的类型熟稔于心,因为数据分析方法的选择与数据的类型是有密切联系的。R 提供了一系列用于判断某个对象的数据类型的函数,还提供了将某种数据类型转换为另一种数据类型的函数。这些函数都存在于基本包 base 里,下面列出了其中的一部分常用函数:
数据类型的判断与转换函数
判断 | 转换 |
---|---|
is.numeric( ) | as.numeric( ) |
is.character( ) | as.character( ) |
is.logical( ) | as.logical( ) |
is.factor( ) | as.factor( ) |
is.vector( ) | as.vector( ) |
is.matrix( ) | as.matrix( ) |
is.array( ) | as.array( ) |
is.data.frame( ) | as.data.frame( ) |
is.list( ) | as.list( ) |
is.table( ) | as.table( ) |
以 is.
开头的函数的返回值为 TRUE 或 FALSE,而以 as.
开头的函数将对象转换为相应的类型。
8. 获取其他格式的数据
8.1 txt 与csv 格式
如果数据来源是一个用 Windows 记事本或其他纯文本编辑器所创建的 ASCII 格式文件,我们可以使用函数 read.table( )
读取其中的数据,返回的是一个数据框。
write.table(patients, file = "patients.txt", sep = "\t", row.names = FALSE)
patients.data <- read.table("patients.txt", header = TRUE)
patients.data
在电子表格和数据库应用中经常会生成带分隔符的文本文件,其中.csv 文件是用逗号分隔取值(Comma Separated Values)。函数 read.csv( )
是函数 read.table( ) 的一个变体,专用于读取 .csv 文件。 需要注意的是,read.table( ) 和 read.csv( ) 两个函数中参数的默认值是不同的。在函数 read.table( ) 中,参数 header 默认值为 FALSE,即认为文件第一行开始就是数据而非变量名。而在函数 read.csv( )中,参数 header 默认值为 TRUE。因此,在读入数据前,建议先打开原始文件进行查看,然后设置恰当的参数正确地读入数据。例如:
write.csv(patients, "patients.csv", row.names=FALSE)
patients.data <- read.csv("patients.csv")
patients.data
8.2 xls 或 xlsx 格式
读取电子表格数据有很多种方式,其中最简单的方式是在 Excel 中将数据文件另存为一个逗号分隔(.csv)文件,然后用上述读取.csv 文件的方法将其读入R。还可以借助第三方包(例如 openxlsx 包、readxl 包和 gdata 包)直接读取 xlsx 或 xls 格式的数据文件。
library(openxlsx)
write.xlsx(patients, "patients.xlsx")
patients.data <- read.xlsx("patients.xlsx", sheet = 1)
patients.data
8.3 导出数据
由于 R 主要用于数据分析,导入文件比导出文件更常用,但有时我们也需要将数据或分析结果导出。函数 write.table( ) 和 write.csv( ) 可以分别将数据导出到一个 .txt 文件和 .csv 文件。
此外,函数 save( )
可以将工作空间中的指定对象保存为以 .rdata
为扩展名的 R 数据文件。例如:
save(patients.data, file = "patients.rdata")
rdata 格式文件占用空间小,用 R 读入速度很快。建议在导入其他格式的数据并整理好后,将其保存为 rdata 格式。要导入这种格式的数据,只需调用 load( )
函数。
load("patients.rdata")
8.4 用 rio 包导入和导出数据
R 中的 rio 包以提供一个类似万能工具的包为目标,用统一的 import( )
函数和 export( )
函数简化了用户导入和导出数据的工作。此外,该包里的 convert( )
函数可以实现不同文件格式之间的转换。rio 包支持多种文件格式,包括 SAS、SPSS、Stata、Excel、MATLAB、Minitab 等其他软件中使用的数据文件格式。 下面以 datasets 包里面的数据集 infert 为例介绍 rio 包的几个常用功能。
library(rio)
data("infert")
str(infert)
函数 str( )
常用于查看数据集的大小(观测的记录数及变量个数),以及各个变量的类型。从上面的输出可以看出,infert 是一个包含 248 个观测记录、每个记录有 8 个变量的数据框。 运行下面的命令将此数据框导出为 .csv 文件:
export(infert, "infert.csv")
在当前工作目录中可以找到刚才导出的名为 infert.csv
的数据文件。运行下面的命令将该文件从 .csv 文件转换成 .sav 文件:
convert("infert.csv", "infert.sav")
然后用函数 import( )
把上面生成的 .sav 文件导入 R 中,并命名为 infert.data:
infert.data <- import("infert.sav")
函数(或数据集):
函数(或数据集) | 来源包 | 功能描述 |
---|---|---|
as.character( ) | base | 将对象转换为字符串 |
as.factor( ) | base | 将对象转换为因子 |
as.numeric( ) | base | 将对象转换为数值 |
array( ) | base | 创建数组 |
bacteria | MASS | 数据集 |
boxplot( ) | graphics | 绘制箱线图 |
c( ) | base | 创建向量 |
class( ) | base | 获取对象的类型 |
colMeans( ) | base | 按列求均值 |
colSums( ) | base | 按列求和 |
convert( ) | rio | 转换数据格式 |
data( ) | utils | 加载R |
data.frame( ) | base | 创建数据框 |
det( ) | base | 求矩阵的行列式 |
dim( ) | base | 获取对象的维数 |
export( ) | rio | 将数据框导出为一个数据文件 |
factor( ) | base | 将一个向量转换为因子 |
hist( ) | graphics | 绘制直方图 |
import( ) | rio | 导入数据文件 |
infert | datasets | 数据集 |
iris | datasets | 数据集 |
is.logical( ) | base | 判断对象是否为逻辑型 |
is.numeric( ) | base | 判断对象是否为数值型 |
is.vector( ) | base | 判断对象是否为向量 |
length( ) | base | 获取对象的长度 |
levels( ) | base | 获取因子的水平 |
list( ) | base | 创建列表 |
matrix( ) | base | 创建矩阵 |
read.csv( ) | utils | 读取.csv |
read.dta( ) | foreign | 读取Stata |
read.epiinfo( ) | foreign | 读取EpiData |
read.spss( ) | foreign | 读取SPSS |
read.table( ) | utils | 读取文本格式数据文件 |
read.xlsx( ) | openxlsx | 读取Excel |
read.xport( ) | foreign | 读取SAS |
relevel( ) | stats | 改变因子水平的顺序 |
rep( ) | base | 将对象重复显示 |
rbinom( ) | stats | 生成服从二项分布的随机数 |
rnorm( ) | stats | 生成服从正态分布的随机数 |
rpois( ) | stats | 生成服从Poisson |
runif( ) | stats | 生成服从均匀分布的随机数 |
rowMeans( ) | base | 按行求均值 |
rowSums( ) | base | 按行求和 |
save( ) | base | 将对象保存为R |
sd( ) | stats | 求样本标准差 |
seq( ) | base | 生成有规则的序列 |
set.seed( ) | base | 设置生成随机数的种子数 |
solve( ) | base | 求解矩阵方程 |
str( ) | utils | 显示对象的内部结构 |
t( ) | base | 矩阵的转置运算 |
var( ) | stats | 求样本方差 |
View( ) | utils | 打开数据浏览窗口 |
write.csv( ) | utils | 将数据框导出到一个.csv |
write.table( ) | utils | 将数据框导出到一个文本文件 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!