【问题标题】:Using a vector to read in multiple csv files to r使用向量将多个 csv 文件读入到 r
【发布时间】:2014-12-09 06:31:11
【问题描述】:

我对 R 非常陌生,并试图弄清楚如何使用向量来读取多个 csv 文件。我想创建一个包含我要读取的文件的向量,一个包含我将存储数据的数据帧名称的向量,以及一个使用这两者来处理多个文件的函数。这是我正在尝试的代码:

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)

我收到以下错误“文件中的错误(文件,“rt”):无效的“描述”参数”

我未经训练的眼睛无法找到逻辑问题,并欢迎更有经验的 r 程序员提供任何指导。

【问题讨论】:

  • Stackoverflow 上已经有很多答案了。
  • 检查数据集后尝试lapply(filevar, function(x) read.csv(file.path("C:/study_data", x), header=TRUE, sep=""))替换header=TRUE, sep=''

标签: r csv vector user-defined-functions


【解决方案1】:

虽然我不想告诉 R 新手使用循​​环,但这是你最好的选择。

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])
}

【讨论】:

  • 为什么?仅仅因为某人是 R 的新手并不意味着他们是编程新手,而 for 循环与任何软件工具一样普遍存在。
  • 是的,我的意思是在 R 中养成向量化而不是使用循环的习惯是很好的,因为你是对的:循环无处不在,而且新的 R 程序员经常过度使用它们。话虽这么说,但阅读 csvs 并不能真正被矢量化,所以我想我的评论没有太多意义,除了提请注意您应该在 R 中尽可能少地使用循环这一事实。这通常不用说,但既然他是新用户,我想我会提到它
  • 这不符合 OP 的要求。如果他们想要返回列表,lapply 将是一个更好的解决方案
  • 已编辑以包含这种做事方式。我坚持我的断言,即 apply 函数不如循环,因为它们的透明度较低(= 更难调试),并且不会给您带来任何性能优势。
  • 取决于您想要返回的内容。如果您想要返回列表,那么lapply(x, FUN)L &lt;- vector("list", length(x));for (i in x) L[[i]] &lt;- FUN()) 更容易。当我主要为副作用循环时,我使用for 循环。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-10
  • 2014-12-29
  • 1970-01-01
  • 1970-01-01
  • 2018-07-26
  • 2018-11-22
  • 2019-11-21
相关资源
最近更新 更多