使用向量将多个csv文件读入R

3

我是一个新手,正在学习如何使用向量读取多个csv文件,需要用到的技术是R。我想创建两个向量,一个用于存储要读取的文件,另一个用于存储数据框的名称,并创建一个函数来处理这些文件。以下是我尝试的代码:

filevar<-c("study_data_raw.csv","study_data_cleaned.csv")
dfs<-c("study_data_raw","study_data_cleaned")
myfunc<-function(x,y) {
  y<- read.csv(file.path("C:/study_data",x))
  }
myfunc(filevar,dfs)

我遇到了以下错误 "Error in file(file, "rt") : invalid 'description' argument"。
我这个没有经验的人找不到逻辑问题,非常欢迎有更多经验的 R 程序员的指导。

1
Stackoverflow上已经有很多关于这个问题的答案了。 - Adii_
1
尝试使用lapply(filevar, function(x) read.csv(file.path("C:/study_data", x), header=TRUE, sep="")),在检查数据集后替换为header=TRUE, sep='' - akrun
1个回答

1

虽然我不喜欢让新手使用循环,但这是你在这里的最佳选择。

filevar<-c("study_data_raw.csv","study_data_cleaned.csv")
fileData <- list()
for(fileNum in 1:length(fileVar))
{
  fileData[[fileNum]] <- read.csv(file = paste0("C:/study_data/",filevar[fileNum]))
}

(请注意,apply 函数里面有循环,所以它们不会更快,而且它们不易读/难以调试。)

我建议使用这种方法,因为它允许您通过编号引用文件。如果您希望它们具有名称,请执行此操作

filevar<-c("study_data_raw.csv","study_data_cleaned.csv")
dfs<-c("study_data_raw","study_data_cleaned")
for(fileNum in 1:length(fileVar))
{
  assign(dfs[fileNum],read.csv(file = paste0("C:/study_data/",filevar[fileNum])))
}

奖励分数: 对于任何R语言用户,我建议开始使用管道以进一步提高可读性。
library(magrittr) # or install.packages("magrittr") first
library(dplyr) # or install.packages("dplyr") first

filevar<-c("study_data_raw.csv","study_data_cleaned.csv")
dfs<-c("study_data_raw","study_data_cleaned")
for(fileNum in 1:length(fileVar))
{
  paste0("C:/study_data/",filevar[fileNum]) %>%
  readcsv() %>%
  assign(dfs[fileNum])
}

1
为什么?仅仅因为某人是R的新手并不意味着他们是编程新手,而for循环是任何软件工具中最普遍的概念之一。 - Carl Witthoft
1
是的,我的意思是在R中,养成向量化而不是使用循环的习惯很好,因为你是对的:循环是无处不在的,而且新的R程序员经常过度使用它们。话虽如此,读取csv文件实际上无法进行向量化处理,所以我想我的评论没有太多意义,除了引起注意,即在R中尽可能少地使用循环。这通常是不言自明的,但由于他是一个新用户,我想提一下。 - hedgedandlevered
1
这并不是 OP 所要求的。如果他们想要一个列表,lapply 将是更好的解决方案。 - GSee
编辑后包括这种做事方式。我坚持认为,应用函数不如循环好,因为它们不够透明(=更难调试),并且没有性能优势。 - hedgedandlevered
1
取决于你想要的返回结果。如果你想要一个列表作为返回结果,那么使用lapply(x, FUN)比起L <- vector("list", length(x));for (i in x) L[[i]] <- FUN()更简单。当我主要需要循环产生副作用时,我会使用for循环。 - GSee
请注意,apply函数中有循环,因此它们并不更快...这在很大程度上取决于你实际在做什么。 - Rich Scriven

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接