在 R 中导入数据:读取 CSV、Excel、SPSS、Stata、SAS 文件
⚡ 智能摘要
R语言中的数据导入部分涵盖了使用`read.csv()`读取CSV文件、使用`readxl`读取Excel工作簿以及使用`haven`读取SAS、STATA或SPSS文件。本教程还将演示如何在导入时精确选择工作表、行和单元格区域。
数据可以以各种格式存在。对于每种格式 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
我们可以通过两种方式控制读取哪些单元格
- 使用 n_max 参数返回 n 行
- 使用范围参数与 cell_rows 或 cell_cols 结合使用
例如,我们设置 n_max 等于 5 来导入前五行。
# Read the first five row: with header iris <-read_excel(example, n_max =5, col_names =TRUE)
如果我们将 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 样式来选择范围 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。
在第二个示例中,我们使用函数 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) 再次将第一行视为标题,因此返回了所有五列的四行数据。
如果我们想要导入不是从第一行开始的行,我们必须包含 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 中一样,按字母选择列:
# 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() 函数统计缺失值的数量:
- 总和
- 伊斯那
这是代码
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”) |








