如何根据其列名而不是文件名导入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。如果标题合适,就不会发生,对吧?因此返回也不起作用,并给出错误:file(file,“ rt”)中的错误:无效的'description'参数
答案 0 :(得分:2)
不确定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"))