Чтение серии файлов CSV в R, выполнение функций, запись выходов в новые файлы - PullRequest
1 голос
/ 08 мая 2019

Я пытаюсь автоматизировать расчет некоторых потребностей животных в энергии, когда у меня вводятся данные в виде дней на корм, ежедневного потребления корма и т. Д. Мой код сначала считывает исходные данные из 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 я бы получил результаты 1: 150 и т. Д.

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

1 Ответ

1 голос
/ 08 мая 2019

Вам нужно перебрать имена файлов и выполнить существующий код для каждого файла, чтобы решение могло выглядеть так:

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 в свой код с именами файлов в качестве встречной переменной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...