Каков наилучший способ повторного применения скрипта к n ​​.csv-файлам в R? - PullRequest
10 голосов
/ 27 апреля 2011

Моя ситуация :

  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 - ДАТА, ВРЕМЯ, ЗНАЧЕНИЕ

    # 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

любая помощь в том, как это сделать, будет очень признательна.

Ответы [ 2 ]

17 голосов
/ 27 апреля 2011

Обязательно используйте команду Rs dir для создания списка имен файлов вместо того, чтобы вводить их вручную.

filenames = dir(pattern="*01.csv")
for( i in 1:length(filenames) )
{
  ...
9 голосов
/ 27 апреля 2011

Я нахожу цикл for и списки достаточно хороши для подобных вещей. Когда у вас есть рабочий набор кода, достаточно легко перейти из цикла в функцию, которая может быть sapply или похожей, но этот тип векторизации в любом случае уникален и, вероятно, бесполезен вне частных однострочников.

Вы, вероятно, хотите избежать присвоения нескольким объектам с разными именами в рабочей области (это часто задаваемые вопросы, которые обычно называются «как мне назначить () ...»).

Пожалуйста, остерегайтесь моего непроверенного кода.

Вектор имен файлов и список с именованным элементом для каждого файла.

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]]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...