我有一个没有标题行的大型 CSV 文件,并且标题可以作为向量提供给我。我想使用文件列的子集而不加载整个文件。所需列的子集作为单独的列表提供。
编辑:在这种情况下,标题列表中提供的列名称很重要。该 MRE 只有 4 个列名称,但该解决方案应该适用于具有预先指定列名称的大型数据集。问题是列名称仅在外部提供,而不是作为 CSV 文件中的标题。
1,2,3,4
5,6,7,8
9,10,11,12
header <- c("A", "B", "C", "D")
subset <- c("D", "B")
到目前为止,我一直以以下方式读取数据,这得到了我想要的结果,但首先加载整个文件。
# Setup
library(readr)
write.table(
structure(list(V1 = c(1L, 5L, 9L), V2 = c(2L, 6L, 10L), V3 = c(3L, 7L, 11L), V4 = c(4L, 8L, 12L)), class = "data.frame", row.names = c(NA, -3L)),
file="sample-data.csv",
row.names=FALSE,
col.names=FALSE,
sep=","
)
header <- c("A", "B", "C", "D")
subset <- c("D", "B")
# Current approach
df1 <- read_csv(
"sample-data.csv",
col_names = header
)[subset]
df1
# A tibble: 3 × 2
D B
<dbl> <dbl>
1 4 2
2 8 6
3 12 10
如何在不先加载整个文件的情况下获得相同的结果?
相关问题
- 仅读取选定的列,包括第一行中的标题。
- 如何将文件中的选定列读入 R?
read.table
(和之间的折衷方案scan
?) [重复]未指定文件外部的列名称,答案不适用于这种情况。 - 如何跳过读取 readr [重复] 中的某些列是不同的,因为它似乎是跳过未知的第一列并跨多个文件读取已知的第二和第三列。在这个问题中,数据类型不一定是事先知道的。
- 有没有办法在读取 csv [重复] 时省略第一列:根据位置跳过列,而不是根据外部提供的列名称列表中的位置跳过列。
在 OP 编辑标题之前
您不必立即读取整个文件,因为该函数有一个参数
read_csv()
。您只需要修改您的代码即可编辑后
如果您像OPs问题中那样给出参数定义的向量,则需要遵循Darren的答案,
any_of
否则您将收到警告消息重要提示:
col_names=
必须为 csv 文件的列长度指定标题,否则会出现错误您可以使用
readr::read_csv
withcol_names
和col_select
参数。如果您使用包
read_csv
中的 ,readr
您将拥有col_select
可以选择要读取的列的参数。该
readr::read_csv()
函数有一个名为 的参数col_select
,允许您指定使用与 相同的语言读取哪些列dplyr::select()
。所以在实践中,这看起来像:然后给出所需的输出:
您还可以调用它来确认读取文件时跳过
attr(df1, "spec")
的列A
和列。C