我尝试使用read_csv
from {readr}
读一个CSV
文件到 R 中。为了演示我的真正问题,我重置了参数guess_max
最初为 5(默认为 1000)
library(readr)
formals(read_csv)$guess_max <- 5
并以较小的文字数据为例:
csv <- I(
"ID, Col1, Col2, VarA, VarB, VarC
1, NA, NA, NA, NA, NA
2, NA, NA, NA, NA, NA
3, NA, NA, NA, NA, NA
4, NA, NA, NA, NA, NA
5, 0, 1, x, y, z
6, NA, NA, NA, NA, NA")
read_csv(csv)
# # A tibble: 6 × 6
# ID Col1 Col2 VarA VarB VarC
# <dbl> <lgl> <lgl> <lgl> <lgl> <lgl>
# 1 1 NA NA NA NA NA
# 2 2 NA NA NA NA NA
# 3 3 NA NA NA NA NA
# 4 4 NA NA NA NA NA
# 5 5 FALSE* TRUE* NA* NA* NA*
# 6 6 NA NA NA NA NA
*
: 出现解析问题
受影响guess_max
,仅前 5 行(列名称和ID
1 到 4) 用于猜测列类型。因为值在ID
1 到 4 全部缺失,所有列都被猜测为logical
并被错误地解析:
-
0
, 1
(整数)→FALSE
, TRUE
(逻辑)
-
'x'
, 'y'
, 'z'
(人物)→NA
(逻辑)
在这种情况下我必须设置col_types
手动:
read_csv(csv, col_types = cols(Col1 = col_integer(), Col2 = col_integer(),
VarA = col_character(), VarB = col_character(), VarC = col_character()))
# # A tibble: 6 × 6
# ID Col1 Col2 VarA VarB VarC
# <dbl> <int> <int> <chr> <chr> <chr>
# 1 1 NA NA NA NA NA
# 2 2 NA NA NA NA NA
# 3 3 NA NA NA NA NA
# 4 4 NA NA NA NA NA
# 5 5 0 1 x y z
# 6 6 NA NA NA NA NA
当列太多时,一一提供列类型很烦人。如果我想指定的那些列的名称有一些模式,我希望使用-like 语法来指定跨多个列的类型,例如across()
in {dplyr}
。伪代码如下:
read_csv(csv, col_types = cols(across(starts_with("Col"), col_integer()),
across(starts_with("Var"), col_character())))
是否可以通过readr
本身还是其他附加包?
提前致谢!
Edits
我需要使用col_xxx()
而不是它们的缩写('i'
, 'c'
等)来创建更通用的列规范,例如
cols(across(contains("Date"), col_date(format = "%m-%d-%Y")),
across(Fct1:Fct9, col_factor(levels = custom_levels)))