使用 read_csv() 读取 CSV 文件
使用列类型推断、跳过和编码选项导入分隔文件
使用 read_csv() 读取 CSV 文件 是 CoddyKit 上的免费 R Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 R Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 R Academy 课程共包含 4 节课。
为什么使用 readr,而不是基础 R?
基础 R 提供了 read.csv(),但 readr 软件包中的 read_csv() 速度更快,返回 tibble(而不是数据框),能够更好地猜测默认类型,还会提供有关所检测列类型的详细信息。
library(readr)
# read_csv() vs read.csv():
# 1. Returns a tibble (prints nicely, faster subsetting)
# 2. Does NOT convert strings to factors by default
# 3. Shows column specification message
# 4. Faster for large files
# Example with a simple inline CSV:
df <- read_csv('name,score,grade
Alice,85,B
Bob,92,A
Carol,78,C')
print(df)
print(class(df))从文件路径读取 read_csv()
最常见的用法是:将文件路径字符串传递给 read_csv()。该函数会自动将分隔符识别为逗号,将第一行读取为表头,并根据前 1000 行猜测列类型。
library(readr)
# Reading from a file path (illustrative — file not present)
# df <- read_csv('data/sales_2024.csv')
# Reading from a URL also works:
# df <- read_csv('https://example.com/data.csv')
# Using a literal inline string for demonstration:
df <- read_csv('region,q1,q2,q3
East,100,120,115
West,200,195,210
North,80,85,90')
print(df)col_types — 指定列类型
使用 col_types 覆盖 readr 的类型猜测结果。您可以传入紧凑字符串(每列使用一个字符:c=字符型,d=双精度型,i=整型,l=逻辑型,D=日期型,_=跳过),也可以传入 cols() 规范。
library(readr)
df <- read_csv('id,date,amount,active
1,2024-01-15,99.99,TRUE
2,2024-02-20,149.50,FALSE
3,2024-03-10,75.00,TRUE',
# Compact: integer, Date, double, logical
col_types = 'iDdl')
print(df)
cat('\nColumn types:\n')
print(sapply(df, class))使用 cols() 明确指定类型
如需更精细的控制,请使用 cols() 为每一列指定类型。可使用以下收集器函数:col_double()、col_character()、col_integer()、col_date(format=)、col_skip() 和 col_guess()。
library(readr)
df <- read_csv('id,name,score,date
1,Alice,85.5,2024-01-15
2,Bob,92.0,2024-02-20
3,Carol,78.3,2024-03-10',
col_types = cols(
id = col_integer(),
name = col_character(),
score = col_double(),
date = col_date(format = '%Y-%m-%d')
))
print(df)
print(class(df$date))skip 和 n_max 参数
skip=n 会在读取前跳过开头的 n 行(适用于元数据或注释表头)。n_max=n 最多读取 n 行数据,非常适合预览大型文件或只加载第一个数据块。
library(readr)
# File with metadata in first 2 lines
# (simulated with literal string)
df <- read_csv('# Generated 2024-01-15
# Source: internal DB
name,score,grade
Alice,85,B
Bob,92,A
Carol,78,C
Dave,88,B',
skip = 2, # Skip the 2 comment lines
n_max = 3 # Read only 3 data rows
)
print(df)na 参数 — 定义缺失值
默认情况下,read_csv() 会将空字符串和 NA 视为缺失值。使用 na 参数可以指定其他应读取为 NA 的字符串,常见示例包括:'N/A'、'NULL'、'-999' 和 '.'。
library(readr)
df <- read_csv('name,score,city
Alice,85,NYC
Bob,N/A,NULL
Carol,78,.
Dave,-999,Chicago',
na = c('', 'NA', 'N/A', 'NULL', '.', '-999')
)
print(df)
cat('NAs per column:\n')
print(colSums(is.na(df)))col_names — 自定义列名
当文件没有表头行时,请设置 col_names = FALSE,readr 会自动将列命名为 X1、X2 等。或者,您也可以向 col_names 传入字符向量,以指定自定义名称并跳过表头行。
library(readr)
# File without headers
df <- read_csv('Alice,85,NYC
Bob,92,LA
Carol,78,Chicago',
col_names = c('name','score','city')
)
print(df)
# auto-names when no header:
df2 <- read_csv('1,2,3
4,5,6', col_names = FALSE)
print(df2)locale() — 处理非标准格式
locale() 控制 readr 如何解读特定地区格式:小数标记(欧洲数据中使用 ',')、日期格式、编码和分组标记。请将其传递给 read_csv(locale=...)。
library(readr)
# European-style CSV: semicolons as delimiters, comma as decimal
# read_csv2() is shorthand for this locale
df <- read_csv2('name;price;qty
Alice;9,99;100
Bob;24,50;50',
locale = locale(decimal_mark=',')
)
print(df)
# For dates in non-ISO format:
parse_date('15/01/2024', format='%d/%m/%Y')progress 和 show_col_types
对于大型文件,read_csv() 会显示进度条。设置 progress=FALSE 可以隐藏进度条(在脚本中很有用)。如果您已经验证过列类型,设置 show_col_types=FALSE 可以隐藏列类型提示。
library(readr)
# Suppress progress and type messages for production scripts
df <- read_csv(
'a,b,c
1,x,TRUE
2,y,FALSE',
show_col_types = FALSE,
progress = FALSE
)
print(df)Problems() — 诊断解析失败
当 readr 遇到与预期类型不匹配的值时,会将其替换为 NA 并记录警告。调用 problems(df) 可以准确查看哪些行和列存在问题,以及原始值是什么。
library(readr)
# Intentional type mismatch: 'N/A' in numeric column
df <- suppressWarnings(read_csv(
'id,score
1,85
2,N/A
3,92',
col_types = cols(score = col_double())
))
print(df)
print(problems(df))使用 map() 读取多个文件
将 readr 与 purrr::map() 结合使用,可以一步读取多个 CSV 文件并按行绑定。对于处理按月或按季度拆分、分别存储在不同文件中的数据,这种模式非常重要。
library(readr)
library(purrr)
library(dplyr)
# Simulated: read and bind multiple CSV files
files <- c('q1.csv', 'q2.csv', 'q3.csv')
# In practice:
# all_data <- map_df(files, read_csv, show_col_types=FALSE)
# Demonstration with inline data:
q1 <- read_csv('month,sales\nJan,100\nFeb,120', show_col_types=FALSE)
q2 <- read_csv('month,sales\nApr,130\nMay,145', show_col_types=FALSE)
bind_rows(list(q1=q1, q2=q2), .id='quarter')快速检查
如何告诉 read_csv(),应将值 'N/A' 和 '-99' 视为缺失值(NA)?
回顾:使用 readr 的 read_csv()
使用 readr 读取 CSV 文件的要点:
read_csv('file.csv')— 读取 CSV,返回 tibble,并猜测列类型col_types = 'idcl'或cols(x=col_double())— 明确指定类型skip=n— 跳过表头或元数据行;n_max=n— 限制读取的行数na = c('N/A','NULL')— 将其他字符串视为 NAlocale(decimal_mark=',')— 处理欧洲数字格式show_col_types=FALSE— 在脚本中隐藏类型信息problems(df)— 查看解析失败情况- 与
map_df(files, read_csv)结合以读取多个文件
library(readr)
# Production-ready read_csv() call
df <- read_csv(
'name,score,city,active
Alice,85,NYC,TRUE
Bob,N/A,LA,FALSE
Carol,78,NULL,TRUE',
col_types = cols(
name = col_character(),
score = col_double(),
city = col_character(),
active = col_logical()
),
na = c('', 'NA', 'N/A', 'NULL'),
show_col_types = FALSE
)
print(df)常见问题解答
「使用 read_csv() 读取 CSV 文件」课时是免费的吗?
是的 — 「使用 read_csv() 读取 CSV 文件」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 R Academy 课程的其余内容,请升级到 CoddyKit PRO。 R Academy 课程共包含 4 节课。
「使用 read_csv() 读取 CSV 文件」这节课中我会学到什么?
使用列类型推断、跳过和编码选项导入分隔文件 你通过在浏览器中直接运行的动手代码来练习 R Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 R Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 R Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「使用 read_csv() 读取 CSV 文件」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 R Academy 课中编写并运行代码吗?
能。每节 R Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 使用 read_csv() 读取 CSV 文件
- 解析 TSV 与定宽文件
- 使用 readxl 导入 Excel 文件
- 将数据写入多种格式