tidyverse-数据读入
好的!根据你的笔记内容,我将详细解释如何使用 readr
包中的函数来导入数据、处理数据导入过程中可能遇到的问题,以及如何将数据写入文件。以下是每个部分的详细说明和示例代码。
1. 从文件中读取数据
1.1 使用 read_csv()
读取 CSV 文件
read_csv()
是 readr
包中用于读取 CSV 文件的主要函数。它会自动猜测列类型,并处理缺失值。
基本语法
read_csv(file, col_types = NULL, locale = default_locale(), na = c("", "NA"), ...)
file
:文件路径。col_types
:指定列类型。locale
:设置语言环境。na
:指定缺失值的标记。...
:其他参数,如skip
、comment
等。
示例
假设我们有一个名为 students.csv
的文件,内容如下:
id,name,age,meal_plan
1,John,20,"Standard"
2,Jane,22,"Premium"
3,Mike,21,"Standard"
使用 read_csv()
读取文件:
library(readr)students <- read_csv("students.csv")
print(students)
1.2 处理列名和缺失值
- 默认情况下,
read_csv()
将空字符串识别为NA
。 - 如果文件中使用其他标记表示缺失值(如
N/A
),可以通过na
参数指定。
示例
students <- read_csv("students.csv", na = c("", "NA", "N/A"))
print(students)
在数据文件中,缺失值(missing values)通常用特定的标记表示。常见的缺失值标记包括空字符串(“”)、NA 或 N/A。read_csv() 函数默认将空字符串(“”)识别为缺失值(NA),但如果你的数据中使用了其他标记(如 NA 或 N/A),你需要显式地告诉 read_csv() 如何识别这些标记。
1.3 列名处理
如果列名包含空格或特殊字符,可以用反引号引用。也可以使用 janitor::clean_names()
将列名转换为蛇形命名法。
示例
library(janitor)students <- read_csv("students.csv") %>%clean_names()
print(students)
为了方便后续操作,你可以使用 janitor::clean_names() 函数将列名转换为蛇形命名法(snake_case)。蛇形命名法是一种常见的命名方式,使用下划线 _ 连接单词,而不是空格或特殊字符。
1.4 转换列类型
可以通过 mutate()
将分类变量转换为因子类型。
示例
library(dplyr)students <- students %>%mutate(meal_plan = factor(meal_plan))
print(students)
2. 其他参数
2.1 skip
参数
跳过文件开头的行(如元数据)。
示例
students <- read_csv("students.csv", skip = 2)
print(students)
2.2 comment
参数
忽略以特定字符开头的注释行。
示例
students <- read_csv("students.csv", comment = "#")
print(students)
2.3 col_names
参数
可以设置为 FALSE
,让 read_csv()
自动生成列名(如 X1
、X2
等),也可以手动指定列名。
示例
students <- read_csv("students.csv", col_names = c("id", "name", "age", "meal_plan"))
print(students)
3. 其他文件类型
3.1 read_csv2()
:读取以分号分隔的文件
students <- read_csv2("students.csv2")
print(students)
3.2 read_tsv()
:读取制表符分隔的文件
students <- read_tsv("students.tsv")
print(students)
3.3 read_delim()
:读取自定义分隔符的文件
students <- read_delim("students.delim", delim = "|")
print(students)
3.4 read_fwf()
:读取固定宽度字段的文件
students <- read_fwf("students.fwf", col_positions = fwf_positions(c(1, 6, 11, 16), c(5, 10, 15, 20)))
print(students)
3.5 read_table()
:读取空格分隔的固定宽度文件
students <- read_table("students.table")
print(students)
3.6 read_log()
:读取 Apache 日志文件
students <- read_log("students.log")
print(students)
4. 控制列类型
4.1 猜测类型
readr
通过启发式方法猜测列类型:
- 包含
TRUE
、FALSE
或NA
的列被识别为逻辑类型。 - 包含数字的列被识别为数值类型。
- 符合 ISO8601 标准的列被识别为日期或日期时间类型。
- 其他列被识别为字符串类型。
4.2 缺失值与列类型问题
如果列中包含非标准的缺失值标记(如 .
),可能导致列类型被错误识别为字符类型。可以通过 col_types
参数显式指定列类型。
示例
students <- read_csv("students.csv", col_types = cols(id = col_integer(),name = col_character(),age = col_double(),meal_plan = col_factor()
))
print(students)
4.3 列类型
readr
提供了 9 种列类型:
col_logical()
:逻辑类型。col_double()
:双精度数值类型。col_integer()
:整数类型。col_character()
:字符类型。col_factor()
:因子类型。col_date()
:日期类型。col_datetime()
:日期时间类型。col_number()
:宽松的数值解析器,忽略非数值部分。col_skip()
:跳过某些列。
可以通过 cols()
函数指定默认列类型或仅读取特定列。
示例
students <- read_csv("students.csv", col_types = cols(id = col_integer(),name = col_character(),age = col_double(),meal_plan = col_factor()
))
print(students)
5. 从多个文件中读取数据
使用 read_csv()
可以一次性读取多个文件,并将它们合并到一个数据框中。
示例
假设我们有多个销售数据文件(sales1.csv
、sales2.csv
等),可以使用以下代码读取并合并:
sales_files <- list.files(pattern = "sales*.csv")
sales_data <- map_dfr(sales_files, read_csv, .id = "file_name")
print(sales_data)
6. 写入文件
6.1 write_csv()
和 write_tsv()
:写入 CSV 或 TSV 文件
write_csv(students, "students.csv")
write_tsv(students, "students.tsv")
6.2 write_rds()
和 read_rds()
:以 R 的二进制格式保存和读取数据
write_rds(students, "students.rds")
students <- read_rds("students.rds")
6.3 arrow
包:读写 Parquet 文件
library(arrow)write_parquet(students, "students.parquet")
students <- read_parquet("students.parquet")
7. 数据输入
7.1 tibble()
:按列创建数据框
students <- tibble(id = c(1, 2, 3),name = c("John", "Jane", "Mike"),age = c(20, 22, 21),meal_plan = c("Standard", "Premium", "Standard")
)
print(students)
7.2 tribble()
:按行创建数据框
students <- tribble(~id, ~name, ~age, ~meal_plan,1, "John", 20, "Standard",2, "Jane", 22, "Premium",3, "Mike", 21, "Standard"
)
print(students)
8. 总结
- 使用
read_csv()
导入 CSV 文件,可以通过col_types
参数显式指定列类型。 - 处理数据导入过程中可能遇到的问题,例如列类型猜测错误和缺失值处理。
- 使用
write_csv()
、write_rds()
和write_parquet()
将数据写入文件以供后续使用。 - 使用
tibble()
和tribble()
手动创建数据框。
通过这些工具,你可以高效地导入、处理和保存数据,为数据分析做好准备。