Использование for loop и rbind для перебора нескольких файлов

У меня есть небольшой R-скрипт из 14 функций, и я хочу запустить его для 81 файла. Несмотря на то, что я прочитал несколько сообщений о переполнении стека, посвященных аналогичным проблемам, у меня все еще есть проблемы с этим. Я использую for петля и rbind,

Все функции в пределах { } петли работы. Я проверил их без for цикл, и я получаю вектор данных, которые мне нужны. Но когда я бегу for Цикл Я получаю вывод только для последнего файла в папке. Я не уверен, что происходит.

Это for цикл работает правильно (это перебирает файлы) и просто перезаписывает предыдущие прогоны? Если for цикл работает, то я предполагаю, что у меня есть проблемы с моим rbind, Или это for цикл только работает последний файл в list.files()?

В конце я хочу матрицу (или таблицу) с результатами 14 функций для каждого из 81 файла.

Вот код:

res=(1:14)
for(i in list.files())
{ 
  nd = read.csv(i, header= TRUE, row.names =1, check.names = FALSE)
  mx = as.matrix(nd)

  res[1]=basename(i) 
  res[2]=-99  #this is just a place holder
  res[3]=gden(mx) 
  res[4]=centralization(mx,degree)

  deg = degree(mx, gmode="graph", diag=FALSE, rescale=FALSE)
  res[5]=mean(deg)
  res[6]=sd(deg)
  res[7]=max(deg)
  res[8]=min(deg)

  Ndeg = degree(mx, gmode="graph", diag=FALSE, rescale=TRUE)*1000
  res[9]=mean(Ndeg)
  res[10]=sd(Ndeg)
  res[11]=max(Ndeg)
  res[12]=min(Ndeg)

  iso = isolates(mx, diag=FALSE)
  res[13]=length(iso)

  res[14]=nrow(mx)
}
results=rbind(res)
results  

3 ответа

Сделайте ваш набор функций вместе новой функцией и sapply это к каждому элементу list.files():

out <- sapply(list.files(), function(i){ 
  nd = read.csv(i, header= TRUE, row.names =1, check.names = FALSE)
  mx = as.matrix(nd)

  res = numeric(14)
  res[1]=basename(i) 
  res[2]=-99  #this is just a place holder
  res[3]=gden(mx) 
  res[4]=centralization(mx,degree)

  deg = degree(mx, gmode="graph", diag=FALSE, rescale=FALSE)
  res[5]=mean(deg)
  res[6]=sd(deg)
  res[7]=max(deg)
  res[8]=min(deg)

  Ndeg = degree(mx, gmode="graph", diag=FALSE, rescale=TRUE)*1000
  res[9]=mean(Ndeg)
  res[10]=sd(Ndeg)
  res[11]=max(Ndeg)
  res[12]=min(Ndeg)

  iso = isolates(mx, diag=FALSE)
  res[13]=length(iso)

  res[14]=nrow(mx)
  return(res)
}
out

Вы должны иметь rbind(res) внутри цикла, что-то вроде этого приводит к результату = rbind(res), но этого недостаточно. что-то вроде результатов = rbind (результаты,res)

Это зависит от того, как вы хотите хранить их как массив массивов и т. Д. Вам лучше также использовать sapply и т. Д. Вместо цикла

Я также разместил этот вопрос в моей университетской рассылке, и один из студентов дал следующие исправления. И теперь это работает:)

res=(1:14)
summary=(1:14)
for(i in list.files())
{ 
  ....code as above.....

  summary=rbind(summary, res)  
}

summary

# then to put into a .csv
write.csv(summary, "nameoffile.csv")
Другие вопросы по тегам