首页 > 解决方案 > 在导入 csv 列的子集时,R 中最有效的读取 csv 函数/包是什么

问题描述

我正在尝试将 csv 加载到 R 中,即 c。180k 行和 c.9k 列。我只需要 c.100 列的一个子集,并且知道我需要的列的名称。

这个问题的答案涵盖了在导入 csv 时选择列子集的许多不同选项。

使用这些答案和我自己的知识,我尝试使用utils中的read.csvread.tabledata.table中的freadreadr中的read_csv。所有这些函数似乎都导入了整个 csv,然后对列进行了子集化——在我只需要这么小的列子集的情况下,这是非常低效的。我还尝试使用sqldf中的read.csv.sql,这似乎很有希望,因为选择特定列是一项非常常见的 SQL 任务,但我无法导入列的子集,因为我收到了错误。Error: too many columns on file

来自社区的两项真正帮助我的贡献:

  1. 任何人都可以指出一个不同的导入函数,在我只需要一个列子集的情况下它会更有效率吗?
  2. 谁能提供有关这些功能如何工作的更多背景信息并纠正我的误解或向我保证我正在寻找的解决方案不存在?

非常感谢!

PS我之前没有问过很多关于SO的问题,所以如果我需要以不同的方式提问,我会很感激反馈。

标签: rcsvimportfreadreadr

解决方案


有许多命令行实用程序(例如 sed、awk、cut、csvfix、miller、csvkit、csvtk)可以做到这一点。下面我们使用xsv。这会在文件到达 R 之前删除不需要的列。如果 iot 不在 PATH 上,请使用 xsv 的完整路径。 xsv接受如下所示的列名或字段编号。

# write out test data
write.csv(iris, "iris-test.csv", quote = FALSE, row.names = FALSE)

cmd <- "xsv select Sepal.Length,Petal.Length-Species iris-test.csv"
DF <- read.csv(pipe(cmd))

head(DF)
##   Sepal.Length Petal.Length Petal.Width Species
## 1          5.1          1.4         0.2  setosa
## 2          4.9          1.4         0.2  setosa
## 3          4.7          1.3         0.2  setosa
## 4          4.6          1.5         0.2  setosa
## 5          5.0          1.4         0.2  setosa
## 6          5.4          1.7         0.4  setosa

或者使用 UNIX cut(也可以在 R 4.0+ 中的 \Rtools40\usr\bin 中的 Windows Rtools中使用)以下工作。如果cutcutPATH.

cmd2 <- "cut -d, -f 1,3-5 iris-test.csv"
DF <- read.csv(pipe(cmd2))

推荐阅读