写点什么

R 语言之数据获取操作

作者:timerring
  • 2023-08-22
    山东
  • 本文字数:2308 字

    阅读完需:约 8 分钟

文章和代码已经归档至【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:5sex <- 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 中预设的变量的属性,例如变量标签和描述等。

发布于: 刚刚阅读数: 4
用户头像

timerring

关注

公众号【AIShareLab】 2022-07-14 加入

他日若遂凌云志

评论

发布
暂无评论
R语言之数据获取操作_R 语言_timerring_InfoQ写作社区