Использование 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")