哪个是在R中重复应用脚本到n .csv文件的最佳方法?

n.e*_*e.w 11 loops r xts

我的情况:

  1. 我有许多csv文件都具有相同的后缀.csv,但文件名的前两个字符是不同的(即AA01.csv,AB01.csv,AC01.csv等)
  2. 我有一个R脚本,我想在每个文件上运行.该文件基本上从.csv中提取数据并将它们分配给向量/将它们转换为时间序列对象.(例如,AA01 xts timeseries对象,AB01 xts对象)

我想要实现的目标:

  1. 将脚本嵌入更大的循环(或适当),以顺序运行每个文件并应用脚本
  2. 删除创建的中间对象(请参阅下面的代码段)
  3. 给我留下从每个原始数据文件创建的最终xts对象(即AA01到AC01等作为值/向量等)

在R中嵌入此脚本的正确方法是什么?对不起,我是编程菜鸟!

我的脚本代码如下...每个CSV中每列的标题是DATE,TIME,VALUE

    # Pull in Data from the FileSystem and attach it
AA01raw<-read.csv("AA01.csv")
attach(AA01raw)
#format the data for timeseries work
cdt<-as.character(Date)
ctm<-as.character(Time)
tfrm<-timeDate(paste(cdt,ctm),format ="%Y/%m/%d %H:%M:%S")
val<-as.matrix(Value)
aa01tsobj<-timeSeries(val,tfrm)
#convert the timeSeries object to an xts Object
aa01xtsobj<-as.xts(tsobj)
#remove all the intermediate objects to leave the final xts object
rm(cdt)
rm(ctm)
rm(aa01tsobj)
rm(tfrm)
gc()
Run Code Online (Sandbox Code Playgroud)

然后在每个.csv文件上重复,直到提取所有xts对象.

也就是说,我们最终将在R内,准备进一步应用是:

aa01xtsobj, ab01xtsobj, ac01xtsobj....etc
Run Code Online (Sandbox Code Playgroud)

任何有关如何做到这一点的帮助将非常感激.

Tho*_*mer 17

请务必使用Rs dir命令生成文件名列表,而不是手动输入文件名.

filenames = dir(pattern="*01.csv")
for( i in 1:length(filenames) )
{
  ...
Run Code Online (Sandbox Code Playgroud)

  • 如果你有一个文件名列表,你可以只是`lapply`,类似`lapply(list.of.files,my.function,argument1,argument2 ...)`. (7认同)

mds*_*ner 9

我找到一个for循环,列表就足够了这样的东西.一旦你有了一组工作代码,就可以很容易地从一个循环转移到一个可以sapplyor或类似的函数,但这种矢量化无论如何都是特殊的,并且在私有的单行之外可能没用.

您可能希望避免在工作区中分配多个具有不同名称的对象(这是一个常见问题解答,通常会出现为"我如何分配()...".

请注意我未经测试的代码.

文件名向量,以及每个文件的命名元素列表.

files <- c("AA01.csv", "AA02.csv")
lst <- vector("list", length(files))
names(lst) <- files
Run Code Online (Sandbox Code Playgroud)

循环遍历每个文件.

library(timeSeries)

for (i in 1:length(files)) {
    ## read strings as character
    tmp <- read.csv(files[i], stringsAsFactors = FALSE)
    ## convert to 'timeDate'
    tmp$tfrm <- timeDate(paste(tmp$cdt, tmp$ctm),format ="%Y/%m/%d %H:%M:%S"))
    ## create timeSeries object
    obj <- timeSeries(as.matrix(tmp$Value), tmp$tfrm)
    ## store object in the list, by name
    lst[[files[i]]] <- as.xts(obj)
}

## clean up
rm(tmp, files, obj)
Run Code Online (Sandbox Code Playgroud)

现在所有的读取对象都在lst,但是您需要测试该文件是否可用,是否已正确读取,并且您可能希望将名称修改为比文件名更合理.

从列表中按名称索引打印出第一个对象:

lst[[files[1]]]
Run Code Online (Sandbox Code Playgroud)