#r #csv
#r #csv
Вопрос:
У меня около 100 csv-файлов в определенном каталоге, и я хочу использовать прогноз скользящей средней для всех файлов. Ниже приведен код, который я написал:
fileNames <- Sys.glob("*.csv")
for (fileName in fileNames) {
abc <- read.csv(fileName, header = TRUE, sep = ",")
library(stats)
library(graphics)
library(forecast)
library(TTR)
library(zoo)
library(tseries)
abc1 = abc[,1]
abc1 = t(t(abc1))
abc1 = as.vector(abc1)
abc2 = ts(abc1, frequency = 12,start = c(2014,1))
abc_decompose = decompose(abc2)
plot(abc_decompose)
forecast = (abc_decompose$trend)
x <- data.frame(abc, forecast)
write.csv (x, file = fileName, row.names=FALSE, col.names=TRUE)
}
Теперь этот код работает отлично. Он добавляет столбец с именем forecast к каждому из csv-файлов и записывает в них значения прогноза. Проблема заключается в том, что некоторые из этих 100 файлов csv слишком малы, и R показывает следующую ошибку:
Error in decompose(abc2) : time series has no or less than 2 periods
На самом деле меня не интересуют файлы, содержащие менее 10 записей, но удалить их вручную сложно. Пожалуйста, помогите.
Ответ №1:
Вы можете подсчитать строки каждого CSV-файла внутри вашего for
цикла
nrows <- sapply( csvfile, function(f) nrow(read.csv(f)) )
А затем сделайте то, что вы делаете, если nrows> 10.
Для удаления этих файлов используйте unlink.
unlink(x, recursive = FALSE, force = FALSE)
Комментарии:
1. Примечание: если вы не хотите удалять исходные файлы, но просто не хотите их обрабатывать, просто используйте что-то вроде
if(nrows<10) break
внутри вашего цикла.2.
nrows
выдает мне количество строк для каждого из файлов csv, но когда я используюif(nrows<10) break
или,if (nrows>10){#my desired operations}
R выдает следующее предупреждающее сообщение:the condition has length > 1 and only the first element will be used
и программа не выдает желаемый результат.3. В случае, если я не использую никаких ограничений в отношении количества строк и запускаю код для всех csv-файлов в этом каталоге, R показывает мне следующую ошибку
Error in decompose(abc2) : time series has no or less than 2 periods