13

我的情况

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

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

即,我们将在 R 中结束,为进一步应用做好准备的是:

aa01xtsobj, ab01xtsobj, ac01xtsobj....etc

任何有关如何做到这一点的帮助将不胜感激。

4

2 回答 2

24

请务必使用 Rsdir命令生成文件名列表,而不是手动输入它们。

filenames = dir(pattern="*01.csv")
for( i in 1:length(filenames) )
{
  ...
于 2011-04-27T04:23:10.087 回答
11

我发现一个 for 循环和列表对于这样的东西来说已经足够了。一旦你有了一组工作代码,就很容易从一个循环转移到一个可以被sapplyied 或类似的函数,但这种矢量化无论如何都是特殊的,并且可能在私有单线之外没有用处。

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

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

一个文件名向量,以及一个包含每个文件的命名元素的列表。

files <- c("AA01.csv", "AA02.csv")
lst <- vector("list", length(files))
names(lst) <- files

循环遍历每个文件。

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)

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

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

lst[[files[1]]]
于 2011-04-27T03:58:26.930 回答