在 R 中导入数据:读取 CSV、Excel、SPSS、Stata、SAS 文件

⚡ 智能摘要

R语言中的数据导入部分涵盖了使用`read.csv()`读取CSV文件、使用`readxl`读取Excel工作簿以及使用`haven`读取SAS、STATA或SPSS文件。本教程还将演示如何在导入时精确选择工作表、行和单元格区域。

  • 📄 CSV 导入: `read.csv(file, header = TRUE, sep = “,”)` 从本地路径或指定位置加载逗号分隔的文件。 URL.
  • ⚠️ 版本变更: 自 R 4.0.0 起,字符列保持字符格式,因为 stringsAsFactors 现在默认为 FALSE。
  • 📗 Excel导入: readxl 中的 read_excel() 函数可以处理 .xls 和 .xlsx 文件,而 excel_sheets() 函数会首先列出每个工作表。
  • 🎯 精准选择: n_max 限制行数,range 接受 Excel 表示法,cell_rows() 或 cell_cols() 接受索引和字母。
  • 🔄 其他软件: haven 提供了 read_sas()、read_dta() 和 read_sav() 函数,每个函数都只需要一个路径或 URL.
  • 🧹 干净的输入: 导入前,将缺失值编码为 NA,并避免在列名中使用空格或符号。

在 R 中导入数据

数据可以以各种格式存在。对于每种格式 R 具有特定的函数和参数。本教程讲解如何将数据导入 R。

读取 CSV 文件

最常用的数据格式是 .csv,即逗号分隔值。R 在启动时会加载一系列库,其中包括 utils 包。该包提供了 read.csv() 函数,这是打开 CSV 文件的标准方法。以下是语法:

read.csv(file, header = TRUE, sep = ",")

争论:

  • 文件:文件存储的路径
  • :确认文件是否有文件头,默认情况下,文件头设置为TRUE
  • 九月:用于分割变量的符号,默认为`,`。

我们将读取数据文件名为 mtcats。csv 文件存储在线。如果您的 .csv 文件存储在本地,您可以替换代码片段中的 PATH。不要忘记将其包装在 ' ' 内。PATH 需要是一个字符串值。

对于 Mac 用户,下载文件夹的路径是:

 "/Users/USERNAME/Downloads/FILENAME.csv"

对于 Windows 用户:

"C:\Users\USERNAME\Downloads\FILENAME.csv"

请注意,我们应该始终指定文件名的扩展名。

  • 。CSV
  • .XLSX
  • 。文本
  • ...
PATH <- 'https://raw.githubusercontent.com/guru99-edu/R-Programming/master/mtcars.csv'                
df <- read.csv(PATH, header =  TRUE, sep = ',')
length(df)

输出:

## [1] 12
class(df$X)

输出:

## [1] "factor"

在 R 4.0.0 之前的版本中,`read.csv()` 会将每个字符列转换为因子,这就是为什么上面的 `class(df$X)` 返回“factor”的原因。您可以使用 `stringsAsFactors = FALSE` 来关闭此转换。

⚠️ 版本说明:ŕ4.0.0 默认值为 stringsAsFactors = FALSE,因此字符列保持字符类型,第一个示例在现代版本中会返回“字符”。像下面这样显式传递参数,在所有版本中都会得到相同的结果,这是最稳妥的做法。

PATH <- 'https://raw.githubusercontent.com/guru99-edu/R-Programming/master/mtcars.csv'
df <-read.csv(PATH, header =TRUE, sep = ',', stringsAsFactors =FALSE)
class(df$X)

输出:

## [1] "character"

变量 X 的类现在是一个字符。

read.csv() 与 read_csv():应该使用哪个?

R 基础包自带 read.csv() 函数,无需额外包。readr 包则添加了 read_csv() 函数,该函数速度更快,并且自动执行的决策更少。

标准 read.csv()(实用程序) read_csv() (readr)
需要包裹 没有 读者
处理大文件的速度 比较慢 速度快好几倍
Returns & Exchanges 数据框 小声
列名 空格转换为点 完全按照原文保存
类型检测 无声 列规范中报告
library(readr)
df <- read_csv(PATH)

# For very large files, data.table::fread() is faster still
library(data.table)
df <- fread(PATH)

对于小型文件和必须在不加载额外包的情况下运行的脚本,请使用 `read.csv()`。当文件较大或需要保留精确的列名时,请使用 `read_csv()`。

读取 Excel 文件

Excel 文件在数据分析师中非常流行。电子表格易于使用且灵活。R 配备了库 readxl 来导入 Excel 电子表格。

使用此代码

require(readxl)

检查您的机器上是否安装了 readxl。如果​​您使用 r-conda-essential 安装 r,则该库已安装。您应该在命令窗口中看到:

输出:

Loading required package: readxl.

如果该软件包未安装,您可以使用 conda 进行安装。 图书馆 或者在终端中,使用 conda install -c mittner r-readxl。

使用以下命令加载库以导入excel文件。

library(readxl)

readxl_example()

我们在本教程中使用 readxl 包中包含的示例。

使用代码

readxl_example()

查看库中所有可用的电子表格。

阅读示例

要查看特定电子表格的位置,请传递其名称:

readxl_example("geometry.xls")

阅读示例

如果您使用 conda 安装 R,则电子表格位于 Anaconda3/lib/R/library/readxl/extdata/filename.xls

读取excel()

read_excel() 函数可以打开 .xls 和 .xlsx 扩展名的文件,并自动选择正确的解析器。

语法是:

read_excel(PATH, sheet = NULL, range= NULL, col_names = TRUE)
arguments:
-PATH: Path where the excel is located
-sheet: Select the sheet to import. By default, all
-range: Select the range to import. By default, all non-null cells
-col_names: Select the columns to import. By default, all non-null columns

我们可以从 readxl 库导入电子表格并计算第一张表中的列数。

# Store the path of `datasets.xlsx`
example <- readxl_example("datasets.xlsx")
# Import the spreadsheet
df <- read_excel(example)
# Count the number of columns
length(df)

输出:

## [1] 5

excel_sheets()

文件 datasets.xlsx 由 4 个工作表组成。我们可以使用 excel_sheets() 函数找出工作簿中有哪些工作表可用

example <- readxl_example("datasets.xlsx")

excel_sheets(example)

输出:

[1] "iris"     "mtcars"   "chickwts" "quakes"

如果工作表包含多张工作表,则可以使用工作表参数轻松选择特定工作表。我们可以指定工作表的名称或工作表索引。我们可以使用 same() 验证两个函数是否返回相同的输出。

example <- readxl_example("datasets.xlsx")
quake <- read_excel(example, sheet = "quakes")
quake_1 <-read_excel(example, sheet = 4)
identical(quake, quake_1)

输出:

## [1] TRUE

我们可以通过两种方式控制读取哪些单元格

  1. 使用 n_max 参数返回 n 行
  2. 使用范围参数与 cell_rows 或 cell_cols 结合使用

例如,我们设置 n_max 等于 5 来导入前五行。

# Read the first five row: with header
iris <-read_excel(example, n_max =5, col_names =TRUE)

Excel 表格

如果我们将 col_names 更改为 FALSE,R 会自动创建标题。

# Read the first five row: without header
iris_no_header <-read_excel(example, n_max =5, col_names =FALSE)

iris_no_header

在数据框 iris_no_header 中,readxl 生成了五个占位符名称。旧版本生成 X__1 到 X__5,而当前版本生成 …1 到 …5。

Excel 表格

我们还可以使用参数范围来选择电子表格中的行和列。在下面的代码中,我们使用 excel 样式来选择范围 A1 到 B5。

# Read rows A1 to B5
example_1 <-read_excel(example, range = "A1:B5", col_names =TRUE)
dim(example_1)

输出:

## [1] 4 2

example_1 返回 4 行 2 列。A1:B5 区域覆盖了电子表格的五行,但第一行被用作标题行,因此维度为 4x2。

Excel 表格

在第二个示例中,我们使用函数 cell_rows() 来控制要返回的行的范围。如果我们要导入 1 到 5 行,我们可以设置 cell_rows(1:5)。请注意,cell_rows(1:5) 返回的输出与 cell_rows(5:1) 相同。

# Read rows 1 to 5
example_2 <-read_excel(example, range =cell_rows(1:5),col_names =TRUE)			
dim(example_2)

输出:

## [1] 4 5

相比之下,示例 2 是 4 行 5 列。cell_rows(1:5) 再次将第一行视为标题,因此返回了所有五列的四行数据。

Excel 表格

如果我们想要导入不是从第一行开始的行,我们必须包含 col_names = FALSE。如果我们使用 range = cell_rows(2:5),很明显我们的数据框不再有标题。

iris_row_with_header <-read_excel(example, range =cell_rows(2:3), col_names=TRUE)
iris_row_no_header <-read_excel(example, range =cell_rows(2:3),col_names =FALSE)

Excel 表格

您还可以像在 Excel 中一样,按字母选择列:

# Select columns A and B
col <- read_excel(example, range = cell_cols("A:B"))
dim(col)

输出:

## [1] 150   2

注意:range = cell_cols(“A:B”),返回输出所有具有非空值的单元格。数据集包含 150 行,因此 read_excel() 返回最多 150 行。这可以通过 dim() 函数进行验证。

na 参数告诉 read_excel() 函数哪些值应视为缺失值。使用 sum() 和 is.na() 函数统计缺失值的数量:

  1. 总和
  2. 伊斯那

这是代码

iris_na <-read_excel(example, na ="setosa")
sum(is.na(iris_na))

输出:

## [1] 50

我们缺少 50 个值,这些值是属于 setosa 物种的行。

从其他统计软件导入数据

使用以下方式导入来自其他统计软件包的文件: 避风港 软件包,支持 SAS我们可以使用以下函数根据文件扩展名打开不同类型的数据集:

  • SAS: read_sas()
  • STATA:read_dta()(或 read_stata(),相同)
  • SPSS:read_sav() 或 read_por()。我们需要检查扩展名

这些函数都只需要一个参数,即文件存储的路径,并且每个函数都接受一个 URL 就像本地路径一样便捷。

library(haven)

haven 带有 conda r-essential,否则请转到 链接 或者在终端中安装 -c conda-forge r-haven

读取 SAS 文件

为了举例,我们将使用来自 IDRE 的录取数据集。

PATH_sas <- 'https://github.com/guru99-edu/R-Programming/blob/master/binary.sas7bdat?raw=true'
df <- read_sas(PATH_sas)
head(df)

输出:

## # A tibble: 6 x 4
##   ADMIT   GRE   GPA  RANK
##   <dbl> <dbl> <dbl> <dbl>
## 1     0   380  3.61     3
## 2     1   660  3.67     3
## 3     1   800  4.00     1
## 4     1   640  3.19     4
## 5     0   520  2.93     4
## 6     1   760  3.00     2

读取 STATA 文件

对于 STATA 数据文件,您可以使用 read_dta()。我们使用完全相同的数据集,但存储在 .dta 文件中。

PATH_stata <- 'https://github.com/guru99-edu/R-Programming/blob/master/binary.dta?raw=true'
df <- read_dta(PATH_stata)
head(df)

输出:

## # A tibble: 6 x 4				
##   admit   gre   gpa  rank				
##   <dbl> <dbl> <dbl> <dbl>				
## 1     0   380  3.61     3				
## 2     1   660  3.67     3				
## 3     1   800  4.00     1				
## 4     1   640  3.19     4				
## 5     0   520  2.93     4				
## 6     1   760  3.00     2

读取 SPSS 文件

read_sav() 打开 SPSS 文件,该文件带有 .sav 扩展名。

PATH_spss <- 'https://github.com/guru99-edu/R-Programming/blob/master/binary.sav?raw=true'
df <- read_sav(PATH_spss)
head(df)

输出:

## # A tibble: 6 x 4				
##   admit   gre   gpa  rank				
##   <dbl> <dbl> <dbl> <dbl>				
## 1     0   380  3.61     3				
## 2     1   660  3.67     3			
## 3     1   800  4.00     1				
## 4     1   640  3.19     4				
## 5     0   520  2.93     4				
## 6     1   760  3.00     2

数据导入最佳实践

导入前按照以下清单进行检查,可以节省大部分后续清理工作:

  • 电子表格的典型格式是使用第一行作为标题(通常是变量名称)。
  • 文件名或列名中应避免使用空格,因为空格可能被识别为列分隔符。请改用下划线。
  • 最好使用简短的名称
  • 名称中不要使用符号。请写成 exchange_rate_dollar_euro,而不是 exchange_rate_$_€。
  • 将缺失值编码为 NA,而不是空格、破折号或哨兵数字(例如 -99),否则之后必须进行清理。

R 语言中导入数据:函数参考

下表列出了每种文件类型的导入函数、提供该函数的库及其默认参数:

图书馆 目的 功能 默认参数
utils的 读取 CSV 文件 读取.csv() 文件,标头 = TRUE,分隔符 = “,
读xl 读取 EXCEL 文件 读取excel() 路径,范围 = NULL,col_names = TRUE
避风港 读取 SAS 文件 读取_sas()
避风港 读取 STATA 文件 read_dta() / read_stata()
避风港 读取 SPSS 文件 读取_sav()

第二个表格展示了使用 read_excel() 函数导入选定内容的方法:

功能 目的 参数
读取excel() 读取 n 行 n_max = 10
像在 Excel 中一样选择行和列 范围=“A1:D10”
选择有索引的行 范围=单元格行(1:3)
选择带有字母的列 范围 = 单元格列(“A:C”)

常见问题

R 4.0.0 将 stringsAsFactors 的默认值从 TRUE 改为 FALSE。字符列现在仍保持字符类型。如果您的脚本需要在旧版本的 R 上表现一致,请显式传递该参数。

更换 URL 使用引号括起来的完整本地路径,例如“C:/Users/name/data.csv”。在路径末尾使用正斜杠或双反斜杠。 Windows并使用 getwd() 确认工作目录。

readxl 函数在纯 R 语言中读取 .xls 和 .xlsx 文件,无需任何额外操作。 Java 依赖项。只有旧版的 xlsx 包需要。 Java 通过 rJava因此,readxl 是推荐的选择。

导入时静默的类型更改是导致人工智能结果无法复现的常见原因。如 `read_csv()` 函数所报告的那样,显式声明列类型可以确保每次加载的训练数据集都完全相同。

是的。AI 助手可以诊断错误信息中的分隔符错误、编码问题以及误读的头部信息。在继续分析之前,务必使用 str() 或 glimpse() 函数确认结果。

总结一下这篇文章: