我有一个包含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
答案 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")