文章和代码已经归档至【Github仓库:https://github.com/timerring/dive-into-AI 】或者公众号【AIShareLab】回复 R语言 也可获取。
实际上,R 中有大量的内置数据集可用于分析和实践,我们也可以在R 中创建模拟特定分布的数据。而在实际工作中,数据分析者更多时候面对的是来自多种数据源的外部数据,即各式各样扩展名的数据文件,如 .txt、.csv、.xlsx、.xls 等。不同扩展名的文件代表不同的文件格式,这常常会给分析者带来困扰。
R 提供了适用范围广泛的数据导入工具。
1.获取内置数据集
R 中的内置数据集存在于各个包中,其中基本包 datasets
里只有数据集,没有函数。这个包提供了近 100 个数据集,涵盖医学、自然、社会学等各个领域。
你可以用下面的命令进行查看:
data(package = "datasets")
如果想要调用某个数据集,可以使用 data( )
函数。运行下面的命令,R 会加载数据集 iris 到工作空间。
data(iris)
除了 datasets 包,R 中很多其他的包也带有数据集。如果不是运行 R 后自动加载的基本包,我们需要安装和加载这些包以后才能使用其中的数据。下面以 MASS 包里的数据集 bacteria 为例说明数据的调用过程:
library(MASS)
data(bacteria)
2. 模拟特定分布的数据
R 提供了一系列可以用于数值模拟的函数。这些函数以 r
开头,常用的有:rnorm( )、runif( )、rbinom( )和 rpois( ) 等。例如:
# 后续可视化部分会详细介绍直方图
r1 <- rnorm(n = 100, mean = 0, sd = 1)
# head(r1) # 取前 5 个值看看
hist(r1)
r2 <- runif(n = 10000, min = 0, max = 100)
hist(r2)
r3 <- rbinom(n = 80, size = 100, prob = 0.1)
hist(r3)
r4 <- rpois(n = 50, lambda = 1)
hist(r4)
3. 获取其他格式的数据
3.1 txt 与csv 格式
如果数据来源是一个用 Windows 记事本或其他纯文本编辑器所创建的 ASCII 格式文件,我们可以使用函数 read.table( )
读取其中的数据,返回的是一个数据框。
例如,假设创建的数据框 patients 的数据文件 patients.txt
存放于当前工作目录下,我们可以使用下面的命令读取该数据:
# getwd() # 获取当前工作目录
# 临时创建下 patients.txt 数据文件
ID <- 1:5
sex <- c("male", "female", "male", "female", "male")
age <- c(25, 34, 38, 28, 52)
pain <- c(1, 3, 2, 2, 3)
pain.f <- factor(pain, levels = 1:3, labels = c("mild", "medium", "severe"))
patients <- data.frame(ID, sex, age, pain.f)
write.table(patients, "patients.txt", 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
3.2 xls 或 xlsx 格式
读取电子表格数据有很多种方式,其中最简单的方式是在 Excel 中将数据文件另存为一个逗号分隔(.csv)文件,然后用上述读取.csv 文件的方法将其读入R。还可以借助第三方包(例如 openxlsx 包、readxl 包和 gdata 包)直接读取 xlsx 或 xls 格式的数据文件。
以 openxlsx 包为例:
library(openxlsx)
write.xlsx(patients, "patients.xlsx")
patients.data <- read.xlsx("patients.xlsx", sheet = 1)
patients.data
3.3 导入其他统计软件的数据
有时我们需要读取其他统计软件产生的数据,如 SPSS、SAS、Stata、Minitab 等。一种方法是从其他统计软件将数据输出为文本文件,然后使用函数 read.table( ) 或 read.csv( ) 将数据读入 R。另一种方法是借助扩展包,比如 foreign 包,该包的主要功能就是读写其他统计软件的数据。
下面以导入 SPSS 数据文件为例进行说明。
假设数据文件 patients.sav
存放于当前工作目录下,我们可以使用下面的命令将该数据集读入 R:
# 为了节约附件数量,让我们直接从下载到工作区
URL <- "http://download.kesci.com/qlhatmok4/patients.sav"
download.file(URL, destfile = "./patients.sav", method="curl")
library(foreign)
# 函数 `read.spss( )` 中的参数 `to.data.frame` 默认为 FALSE,如果不设置为 TRUE,返回的将是一个列表形式数据。
patients.data <- read.spss("patients.sav" , to.data.frame = TRUE)
patients.data
用 foreign 包导入SAS、Stata 等软件的数据文件的过程与上面类似,具体请查阅文档。
4.数据录入
在 R 中可以直接输入数据,但是如果数据量较大(超过 10 列或超过 30 行),在 R 里录入数据并不是一个最佳选择。我们可以选择电子表格软件录入小规模的数据,比如 Excel。
但是如果数据量很大,使用电子表格软件手工录入数据的出错概率也较大。这时,专门为数据录入而设计的程序软件更为合适,比如免费的软件 EpiData。该软件不仅可以方便地设置数据录入的约束条件,比如范围检查、自动换行等,还可以对每个变量和变量值添加标签。
foreign 包里的函数
read.epiinfo( )
可以直接读取 EpiData 生成的 .rec 文件,但是建议先在 EpiData 中将录入的数据导出为 Stata 数据文件,然后在 R 中使用函数 read.dta( ) 读入数据。这样做的好处是可以保留在 EpiData 中预设的变量的属性,例如变量标签和描述等。