R语言之数据获取操作

2023-10-13 10:52:48 浏览数 (1)

实际上,R 中有大量的内置数据集可用于分析和实践,我们也可以在R 中创建模拟特定分布的数据。而在实际工作中,数据分析者更多时候面对的是来自多种数据源的外部数据,即各式各样扩展名的数据文件,如 .txt、.csv、.xlsx、.xls 等。不同扩展名的文件代表不同的文件格式,这常常会给分析者带来困扰。

R 提供了适用范围广泛的数据导入工具。

1.获取内置数据集

R 中的内置数据集存在于各个包中,其中基本包 datasets 里只有数据集,没有函数。这个包提供了近 100 个数据集,涵盖医学、自然、社会学等各个领域。

你可以用下面的命令进行查看:

代码语言:javascript复制
data(package = "datasets")

如果想要调用某个数据集,可以使用 data( ) 函数。运行下面的命令,R 会加载数据集 iris 到工作空间。

代码语言:javascript复制
data(iris)

除了 datasets 包,R 中很多其他的包也带有数据集。如果不是运行 R 后自动加载的基本包,我们需要安装和加载这些包以后才能使用其中的数据。下面以 MASS 包里的数据集 bacteria 为例说明数据的调用过程:

代码语言:javascript复制
library(MASS)
data(bacteria)

2. 模拟特定分布的数据

R 提供了一系列可以用于数值模拟的函数。这些函数以 r 开头,常用的有:rnorm( )、runif( )、rbinom( )和 rpois( ) 等。例如:

代码语言:javascript复制
# 后续可视化部分会详细介绍直方图
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 存放于当前工作目录下,我们可以使用下面的命令读取该数据:

代码语言:javascript复制
# 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。因此,在读入数据前,建议先打开原始文件进行查看,然后设置恰当的参数正确地读入数据。

代码语言:javascript复制
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 包为例:

代码语言:javascript复制
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:

代码语言:javascript复制
# 为了节约附件数量,让我们直接从下载到工作区
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 中预设的变量的属性,例如变量标签和描述等。

0 人点赞