2014-04-11 29 views
1

我有一堆CSV文件,我想对每个文件中的数据执行相同的分析(在R中)。首先,我假定每个文件都必须读入R中(而不是在CSV上运行函数并提供输出,如sed脚本)。从R中的多个.csv文件读取,处理和导出分析结果

将多个CSV文件输入到R中以便执行分析然后为每个输入输出单独结果的最佳方法是什么?

感谢(顺便说一句,我为完整的R新手)

+0

我会建议'for'循环:) – Jealie

+1

我会建议一个函数,并且可能会从'for'循环中调用它;-) – janos

回答

0

您可以通过将所有CSV文件在同一目录下试试下面的代码。

names = list.files(pattern="*.csv") %csv file names 
for(i in 1:length(names)){ assign(names[i],read.csv(names[i],skip=1, header=TRUE))} 

希望这有助于!

1

可以去肖恩的选择,但它会导致几个问题:

  1. 最终你会与环境中很多不相关的对象的,具有相同名称的文件他们属于。这是一个问题,因为...
  2. For循环可能会非常缓慢,并且因为你有这么大堆不相关的对象,所以你将不得不依赖循环遍历文件名中的每个后续部分分析 - 否则,你会记得什么对象被命名,以便你可以给他们打电话?
  3. 通过以字符串的形式粘贴它们的名字来调用对象 - 这是你必须做的事情,因为再一次,你唯一记录的东西就是这个字符串列表 - 这是一个真正的痛苦。当你不能在代码中写下它的名字时,你有没有尝试过调用一个对象?我有,而且这很可怕。

更好的做法可能与lapply()

# List files 
filelist <- list.files(pattern = "*.csv") 

# Now we use lapply to perform a set of operations 
# on each entry in the list of filenames. 
to_dispose_of <- lapply(filelist, function(x) { 

    # Read in the file specified by 'x' - an entry in filelist 
    data.df <- read.csv(x, skip = 1, header = TRUE) 

    # Store the filename, minus .csv. This will be important later. 
    filename <- substr(x = x, start = 1, stop = (nchar(x)-4)) 

    # Your analysis work goes here. You only have to write it out once 
    # to perform it on each individual file. 
    ... 

    # Eventually you'll end up with a data frame or a vector of analysis 
    # to write out. Great! Since you've kept the value of x around, 
    # you can do that trivially 
    write.table(x = data_to_output, 
       file = paste0(filename, "_analysis.csv"), 
       sep = ",") 
}) 

并完成。

+0

您可以创建一个空的输出文件(函数外部),然后使用'write.table'调用中的append = TRUE,并将所有结果集中在一个文件中。 – marbel

+0

然而,测试是“为每个文件输出不同的结果”。 –

+0

@Ironholds嗯,没有运气,我很害怕。是''函数(x)“'从字面上使用?另外,有没有支架?我没有看到'lapply(filelist')的结束括号,再次对新手问题抱歉,谢谢。 – ijf