【问题标题】:How to import csv file with column names as identifier, not file name in R如何以列名作为标识符导入csv文件,而不是R中的文件名
【发布时间】:2020-12-21 09:47:01
【问题描述】:

如何根据列名而不是文件名导入 csv 文件?假设我的工作目录中有 2 个不同的 csv 文件。其中一个文件名为“interesting.csv”,列名如下:“interesting1”“interesting2”“interesting3”。

我正在寻找可以扫描此文件夹、此工作目录并按列名检查文件的内容,以便我可以使用 read_csv2 读取文件“interesting.csv”。我想知道它是如何完成的,因为有时文件名会改变。假设“interesting.csv”变为“interesting_cool.csv”,但列名不会改变。在这种情况下 read_csv2("interesting.csv") 将不起作用,因为不会有这样的文件。

是否有一个函数可以“扫描”文件夹中所有文件的标题并将其与我提供给 Rscript 的名称进行比较?

类似这样的:read_csv2(find_file_with_headers("interesting1", "interesting2", "interesting3"))

很抱歉,如果这是重复的,我找不到我需要的东西。

问候。

更新 Ronan 的方法:

file_list1 <- list.files(getwd(), full.names = TRUE, pattern = "\\.csv$")
file_list2 <- list.files(getwd(), full.names = TRUE, pattern = "\\.CSV$")
(file_list <- c(file_list1, file_list2)); rm(file_list1, file_list2)

col_names = c("interesting1" "interesting2" "interesting3")

file_index <- which(sapply(file_list, function(x) 
  all(col_names %in% names(read.csv2(x, nrows = 0)))))[1]

return(read.csv2(file_list[file_index]))

如果我像这样拆分它,file_index 工作正常,而“file_index”将导致一个 NA。如果标题适合,这不应该发生,对吧?因此 return 也不起作用并给出错误:文件中的错误(文件,“rt”):无效的“描述”参数

【问题讨论】:

  • 我看到的唯一方法是读取所有 csv 文件的第一行获取它们的标题,然后如果标题匹配某些标准,则导入文件。不过,您可能需要重新考虑此策略。保持表的文件名固定更容易处理。一个中庸之道可能是通过前缀增加文件名,例如,interesting_6.csv、nteresting_7.csv 并导入最新的。
  • 您能帮我打印一下head(file_list) 中的内容吗?
  • [1] "C:/Users/Dutschke/file1.csv" "C:/Users/Dutschke//file2.csv" [3] "C:/Users/Dutschke/file3.csv " "C:/Users/Dutschke/file4.csv" [5] "C:/Users/Dutschke/file5.CSV" 并且其中一个文件具有列 "interesting1" "interesting2" "interesting3"
  • file_index 应该有一个包含col_names 中所有列的文件号。所以我认为没有一个文件包含所有列,这就是它返回NA 的原因。确保列名中没有错字、前导/滞后空格。他们需要完全匹配。 names(read.csv2(file_list[1], nrow = 0)) 返回什么?
  • 是的,结果是一样的,但是如果你的文件很大,read_csv2 会更慢,因为read_csv2 正在读取文件的所有行,而read.csv2 只读取 1(标题)行.

标签: r


【解决方案1】:

不确定 R 中是否有现成的解决方案。

这是一种读取文件夹中所有文件的列名并返回匹配所有传递的列名的完整文件的方法。

return_correct_file <- function(path, col_names) {

  file_list <- list.files(path, full.names = TRUE)
  file_index <- which(sapply(file_list, function(x) 
                     all(col_names %in% names(read.csv2(x, nrows = 0)))))[1]
  return(read.csv2(file_list[file_index]))
}

您可以将此函数称为:

data <- return_correct_file(path = 'path/to/csv/files', 
         col_names = c("interesting1", "interesting2", "interesting3"))

【讨论】:

  • 文件中的错误(文件,“rt”):无效的“描述”参数
  • @Dutschke 表示你的文件路径不正确。 stackoverflow.com/questions/14420936/…你是不是根据你的系统路径改了'path/to/csv/files'?尝试先读取一个文件file_list &lt;- list.files('path/to/csv/files', full.names = TRUE)read.csv2(file_list[1])。它返回什么?
  • 如果我这样做,R 会导入文件,而不给出错误或警告。现在用所有文件再次尝试给我: 文件中的错误(文件,“rt”):无法打开连接另外:警告消息:在文件中(文件,“rt”):文件中的错误(文件,“rt” ):无法打开连接......是的,我已经检查了这个stackoverflow.com/questions/27466317/…,但没有任何帮助。
  • 这很奇怪。我无法在我的系统上重现它。无论有没有功能,它对我来说都很好。我希望你的list.files 中有full.names = TRUE。如果您从函数中删除file_list &lt;- list.files(path, full.names = TRUE) 并将file_list 作为参数传递给函数会怎样?这有什么改变吗?
  • 所以第二个错误是因为在文件夹中我还有除 csv 之外的其他文件。我用 pattern = "\\.csv$" 过滤它,但以下错误仍然存​​在:文件中的错误(文件,“rt”):无效的“描述”参数......如果我删除了你写的内容。
猜你喜欢
  • 2015-03-05
  • 2019-04-16
  • 2013-08-21
  • 2014-08-20
  • 2021-12-03
  • 2010-09-20
  • 2023-02-05
  • 2014-07-20
  • 1970-01-01
相关资源
最近更新 更多