使用 read_csv 跳过列时如何使用缩写指定列类型
How to specify column types with abbreviations when skipping columns with read_csv
我想使用 readr
包中的 cols
函数支持的缩写从 CSV 文件中读取选定的列。但是,当我跳过列时,readr
会尝试猜测列类型,而不是使用我的规范,除非我按名称指定列或设置默认值。
这是一个可重现的例子:
library(tidyverse)
out <- tibble(a = c(1234, 5678),
b = c(9876, 5432),
c = c(4321, 8901))
write_csv(out, "test.csv")
test <- read_csv("test.csv",
col_select = c(a, c),
col_types = "cc")
typeof(test$c)
#> [1] "double"
我可以通过明确指出列名来获得正确的规范:
test2 <- read_csv("test.csv",
col_select = c(a, c),
col_types = c(a = "c", c = "c"))
typeof(test2$c)
#> [1] "character"
我也可以通过将字符设置为默认值来获得正确的规范,如 中所建议的那样。但我想知道是否有一种方法可以使用缩写“cc”获得正确的规范,或者——或者——如何根据被跳过的列生成缩写字符串。我的实际用例涉及大量跳过的列,所以我不想使用 -
或 _
来指定跳过的列。
请参阅 ?read_csv
中 col_types
的文档。您可以使用 _
或 -
指定跳过的列:
read_csv("test.csv",
col_select = c(a, c),
col_types = "c-c")
结果:
# A tibble: 2 x 2
a c
<chr> <chr>
1 1234 4321
2 5678 8901
抱歉,我已经根据对您所问内容的假定理解重写了我之前写的内容,以使其更加清晰。
如果您想在任何跳过或手动更改之前为 csv 文件中的列获取 col_types,那么最简单的方法是使用文件的 spec_csv()
参数生成一个 col class 文本,向您展示 read_csv()
如何 class 确定每个列类型。
从那里您可以将其复制、粘贴和编辑到您的 col_types
参数中,以仅引入您想要的列和列类型。这可以使用 cols_only()
参数而不是 cols()
.
来完成
spec_csv("test.csv")
这将在您的输出控制台中自动生成:
cols(
a = col_double(),
b = col_double(),
c = col_double()
)
输出将告诉您默认的 reader 列类型是什么(PS 您可以像操作 read_csv
参数一样操作 spec_csv()
参数来增加猜测大小,例如 guess_max
用于列类型。
#manually copied and pasted the above output, changed the default to the desired type and deleted the columns I didn't want
read_csv("test.csv",
col_types=cols_only(a = col_character(),
c = col_character())
)
我使用了长格式 (col_character),但您可以使用您之前已经指出的缩写形式。
请告诉我这是否是您要问的问题,或者我是否可以提供任何说明。
我想使用 readr
包中的 cols
函数支持的缩写从 CSV 文件中读取选定的列。但是,当我跳过列时,readr
会尝试猜测列类型,而不是使用我的规范,除非我按名称指定列或设置默认值。
这是一个可重现的例子:
library(tidyverse)
out <- tibble(a = c(1234, 5678),
b = c(9876, 5432),
c = c(4321, 8901))
write_csv(out, "test.csv")
test <- read_csv("test.csv",
col_select = c(a, c),
col_types = "cc")
typeof(test$c)
#> [1] "double"
我可以通过明确指出列名来获得正确的规范:
test2 <- read_csv("test.csv",
col_select = c(a, c),
col_types = c(a = "c", c = "c"))
typeof(test2$c)
#> [1] "character"
我也可以通过将字符设置为默认值来获得正确的规范,如 -
或 _
来指定跳过的列。
请参阅 ?read_csv
中 col_types
的文档。您可以使用 _
或 -
指定跳过的列:
read_csv("test.csv",
col_select = c(a, c),
col_types = "c-c")
结果:
# A tibble: 2 x 2
a c
<chr> <chr>
1 1234 4321
2 5678 8901
抱歉,我已经根据对您所问内容的假定理解重写了我之前写的内容,以使其更加清晰。
如果您想在任何跳过或手动更改之前为 csv 文件中的列获取 col_types,那么最简单的方法是使用文件的 spec_csv()
参数生成一个 col class 文本,向您展示 read_csv()
如何 class 确定每个列类型。
从那里您可以将其复制、粘贴和编辑到您的 col_types
参数中,以仅引入您想要的列和列类型。这可以使用 cols_only()
参数而不是 cols()
.
spec_csv("test.csv")
这将在您的输出控制台中自动生成:
cols(
a = col_double(),
b = col_double(),
c = col_double()
)
输出将告诉您默认的 reader 列类型是什么(PS 您可以像操作 read_csv
参数一样操作 spec_csv()
参数来增加猜测大小,例如 guess_max
用于列类型。
#manually copied and pasted the above output, changed the default to the desired type and deleted the columns I didn't want
read_csv("test.csv",
col_types=cols_only(a = col_character(),
c = col_character())
)
我使用了长格式 (col_character),但您可以使用您之前已经指出的缩写形式。
请告诉我这是否是您要问的问题,或者我是否可以提供任何说明。