3

我想anova对存储在我的工作目录中的多个数据集执行。到目前为止,我提出了:

files <- list.files(pattern = ".csv")
for (i in seq_along(files)) {
    mydataset.i <- files[i]
    AnovaModel.1 <- aov(DES ~ DOSE, data=mydataset.i)
    summary(AnovaModel.1)
} 

如您所见,我对循环非常陌生,无法完成这项工作。我也知道我需要添加一个代码以将所有摘要输出附加到一个文件中。我将不胜感激您可以提供任何帮助来指导工作循环,该循环可以在目录中的多个 .csv 文件(相同的标题)上执行 anovas 并生成记录输出。

4

2 回答 2

2

如果您不在同一条路径上,您可能希望使用list.fileswith 。full.names = TRUE

files <- list.files("path_to_my_dir", pattern="*.csv", full.names = T)
# use lapply to loop over all files
out <- lapply(1:length(files), function(idx) {
    # read the file
    this.data <- read.csv(files[idx], header = TRUE) # choose TRUE/FALSE accordingly
    aov.mod <- aov(DES ~ DOSE, data = this.data)
    # if you want just the summary as object of summary.aov class
    summary(aov.mod)
    # if you require it as a matrix, comment the previous line and uncomment the one below
    # as.matrix(summary(aov.mod)[[1]])
})
head(out)

这应该为您list提供一个列表的每个条目,其顺序与输入文件列表summary matrix顺序相同。

于 2013-01-21T00:26:13.750 回答
2

您的错误是您的循环没有加载您的数据。您的文件名列表在“文件”中,然后您开始浏览该列表并将 mydataset.i 设置为与您的迭代器 i 匹配的文件的名称...但是您尝试在文件名上运行 aov存储在 mydataset.i 中!

您正在寻找将输出重定向到文件的命令是 sink。考虑以下:

sink("FileOfResults.txt") #starting the redirect to the file
files <- list.files("path_to_my_dir", pattern="*.csv", full.names = T) #using the fuller code from Arun
for (i in seq_along(files)){
   mydataset.i <- files[i]
   mydataset.d <- read.csv(mydataset.i) #this line is new
   AnovaModel.1 <- aov(DES ~ DOSE, data=mydataset.d) #this line is modified
   print(summary(AnovaModel.1))
} 
sink() #ending the redirect to the file

我更喜欢 Arun 的这种方法,因为结果直接存储到文件中,无需跳过列表,然后必须弄清楚如何以可读的方式将列表存储到文件中。

于 2013-01-21T15:57:16.900 回答