使用for循环和rbind迭代多个文件

时间:2014-02-26 21:58:03

标签: r loops multiple-files

我有一个包含14个函数的小R脚本,想要为81个文件运行它。虽然我已经在Stack Overflow上阅读了几篇解决类似问题的帖子,但我仍然无法解决这个问题。我使用for循环和rbind

循环的{ }内的所有函数都有效。我在没有for循环的情况下测试了它们,我得到了我需要的数据向量。但是当我运行for循环时,我只得到文件夹中最后一个文件的输出。我不确定发生了什么。

for循环是否正常工作(是否遍历文件)并简单地覆盖以前的运行?如果for循环正常,那么我认为我的rbind存在问题。或者,for循环仅运行list.files()中的最后一个文件吗?

最后,我想要一个矩阵(或表),其中包含81个文件中每个文件的14个函数的结果。

以下是代码:

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 个答案:

答案 0 :(得分:2)

将您的一组功能组合成一个新功能,并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

答案 1 :(得分:-1)

你必须在循环中有rbind(res),就像这样 results = rbind(res),但这还不够。像结果= rbind(结果,res)

这取决于您希望如何将它们存储为数组等数组。 你最好也是为了提供服务等而不是循环

答案 2 :(得分:-2)

我也在我的大学列表服务中发布了这个问题,一位同学提供了以下修正。现在它可以工作:)

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")