2014-06-17 67 views
0

继具有超过10行的CSV文件的功能是,我已经在目录中应用移动平均预测到所有的.csv文件编写的代码。申请中的R

fileNames <- Sys.glob("*.csv") 
for (fileName in fileNames) {  
    abc <- read.csv(fileName, header = TRUE, sep = ",") 
    nrows <- sapply(fileNames, function(f) nrow(read.csv(f))) 
    if (nrows>=as.vector(10)) { 
    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) 
    } 
} 

现在,当我排除线5条,即if(nrows>=as.vector(10))代码上有足够的没有文件工作的罚款。 (我已经拍摄了大约20个文件,所有文件都超过10行)。

但是,我在包含2或少于2个条目的目录中有一些csv文件,所以当代码在整个目录上运行时,它会显示以下错误消息: Error in decompose(abc2) : time series has no or less than 2 periods。由于手动排除这些文件是很难的,我也要用类似线5

现在NROWS是给了我与他们没有目录下的所有文件名的列表。行的,但是当我运行整个代码我得到148个警告消息(该目录中有148个的CSV文件),每个人的说法: In if (nrows >= as.vector(10)) { ... : the condition has length > 1 and only the first element will be used,我没有得到的输出。

所以,肯定我做错事在该行5,请帮助。

+0

你意识到,通过'for'循环每一次,你第一次读“当前”文件(即'fileName'),但后来也读_all_的文件(用'sapply')。也许你打算只检查一下'fileName'的行数?在这种情况下,您应该删除'sapply'行,并将'if'条件更改为'if(nrow(abc)> = 10){'。 – jbaums

回答

0

更改nrows <- sapply(fileNames, function(f) nrow(read.csv(f)))到:

nrows <- nrow(abc) 

为什么你需要采取的行中的所有文件的数量在每次迭代。错误是告诉你哪里出了问题。这是使用每次的第一个文件的行数。