首页 > 解决方案 > 将一系列 CSV 文件读入 R、运行函数、将输出写入新文件

问题描述

我正在尝试自动计算一些动物能量需求,其中我输入了饲料天数、每日采食量等。我的代码首先从 CSV 读取初始数据,使用它来计算循环外的一些起始值,循环运行当天的能量计算循环,将这些结果存储在数据框中,然后将最终数据框写入 CSV。

我有来自 300 多只羊的数据,基于这样的单个记录,并希望自动读取文件,并将结果写入特定文件夹中的单独 CSV 文件。我知道这意味着一个循环中的一个循环,但我试图弄清楚如何去做。

我知道我需要使用 files.list 读取文件,如下所示:

files = list.files("C:/Users/Me/Desktop/Sheepfiles/", pattern = "Sheep+.*csv")

但我希望每个文件都作为其自己的数据框贯穿模型,并且我需要将所有内容分开进出。

setwd("C:Users/....../Sheepfiles")


input =  read.csv(file = "Sheep131.csv", header = TRUE, sep =",")
#set up initialized values outside loop here
LWt0 = input$LWT[1]
EBW = LWT0*.96*.891
#constants go here


Results = NULL;
timefeed = input$DOF

#now the loop
for (i in timefeed) 
{

#differential equations and calculations here

 results1 = (c(t, NEG, MEI, OldMEI, HPmaint, EBW, ID, TRT))
 names(results1) = c("DOF", "NEG", "MEI", "OldMEI","HPmaint", "EBW", "ID", "TRT")

 print((results1))
 Results = rbind(Results,results1)


#update variables to new values here

}
write.csv(Results, file = "Results131.csv")

我想要的是让他们能够拥有名称中带有 SheepX 的文件,每只羊一个,其中 X 是耳标 #,将这些文件读入、计算,然后在 ResultsX.csv 中自动输出结果。如果有帮助,耳标编号位于“ID”列下的原始输入文件中。所以对于绵羊 1:150 我会有 Results1:150 等

稍后,我将需要能够重新读取这些结果文件,在特定日期提取输出,然后将它们拉入数据框以与观察结果进行比较,但这是我运行完所有这些文件后的下一步该模型。

标签: rloopscsv

解决方案


您需要遍历文件名并为每个文件执行现有代码,因此解决方案可能如下所示:

setwd("C:Users/....../Sheepfiles")

files = list.files("C:/Users/Me/Desktop/Sheepfiles/", pattern = "Sheep+.*csv")

for (i in files) {
  input =  read.csv(file = i,
                    header = TRUE,
                    sep = ",")
  #set up initialized values outside loop here
  LWt0 = input$LWT[1]
  EBW = LWT0 * .96 * .891
  #constants go here


  Results = NULL

  timefeed = input$DOF

  #now the loop
  for (i in timefeed)
  {
    #differential equations and calculations here

    results1 = (c(t, NEG, MEI, OldMEI, HPmaint, EBW, ID, TRT))
    names(results1) = c("DOF", "NEG", "MEI", "OldMEI", "HPmaint", "EBW", "ID", "TRT")

    print((results1))
    Results = rbind(Results, results1)


    #update variables to new values here

  }

  # automatically generate filename for results
  result.filename <- gsub("Sheep", "Results", i)

  write.csv(Results, file = result.filename)
}

所以你基本上在你的代码周围包裹了一个 for 循环,你的文件名作为计数器变量。


推荐阅读