保存由 for 循环产生的不同对象

save different objects resulting from a for loop

我正在尝试保存由 for 循环产生的不同对象。

这是我需要的矩阵和子集:

row.names <- c('A2003','B2010','C2011','D2010','E2001','F2005','F2009','G2003','G2007','H2004','H2010')
sp1 <- c(4,83,1,2,4,3,1,5,7,2,4)
sp2 <- c(5,0,2,3,10,5,0,2,4,3,1)
sp3 <- c(7,2,4,8,7,2,4,83,1,5,7)
sp4 <- c(0,2,4,2,4,12,1,5,7,2,4)
Site <- c('A','B','C','D','E','F','F','G','G','H','H')
Year <- c('2003','2010','2011','2010','2001','2005','2009','2003','2007','2004','2010')
Obs <- c(1,1,1,4,9,6,8,2,5,2,3)
ID <- c('A2003','B2010','C2011','D2010','E2001','F2005','F2009','G2003','G2007','H2004','H2010')
df<- data.frame(row.names, sp1, sp2, sp3, sp4, Site, Year, Obs, ID)
rownames(df) <- df[,1]
df[,1] <- NULL
df
#fix(df)
df.1 <- subset(df, Obs == 1)
df.more <- subset(df, Obs >= 2)
df.1
df.more

这是我遇到问题的循环函数的脚本:

N.rows <- nrow(df)
for(i in 1:N.rows){      
  rnd.more <- do.call( rbind, lapply( split(df.more, df.more$Site) ,
                                    function(df.more) df.more[sample(nrow(df.more), 1,replace=FALSE) , ] )  
  )
  print(rnd.more)
  rnd.df <- rbind(df.1,rnd.more)                                   
  rnd.df.bc <- as.matrix(vegdist(rnd.df[1:4], method="bray"))  
  clustering <- agnes(rnd.df.bc, diss=TRUE, method = "ward")        
  print(clustering)
  grps.iter <-cutree(as.hclust(clustering), k=3)                     
  print(grps.iter)
}

问题:

1) 脚本没有像我希望的那样工作,因为 'do.call' 函数给了我一个没有保留行名的数据框。因此,对于以下结果,我无法确定我的观察结果。

2) 我想保存输出。如果不可能一次完成(它们有不同的形式),可以分别作为 "rnd.more"、"clustering" 和 "grps.iter"

我试过研究其他 questions/responses 但我不明白该怎么做...

感谢您的帮助。可怜我吧,我是一个自学的 R 用户......(而且不太好!)

1) 您已将行名放入 ID 列。跟踪问题已解决。

2) 使用列表。

library(cluster)
library(vegan)

out <- vector("list", N.rows)
for(i in 1:N.rows){      
    rnd.more <- do.call("rbind", lapply(split(df.more, df.more$Site),
                                        function(df.more) df.more[sample(nrow(df.more), 1,replace=FALSE) , ])
                        )
    rnd.df <- rbind(df.1,rnd.more)                                   
    rnd.df.bc <- as.matrix(vegdist(rnd.df[1:4], method="bray"))  
    clustering <- agnes(rnd.df.bc, diss=TRUE, method = "ward")        
    grps.iter <-cutree(as.hclust(clustering), k=3)                     
    out[[i]] <- list(rnd = rnd.df, clustering = clustering, grps = grps.iter)
}

# see clustering in first element
out[[1]]$clustering

# extract clustering
all.clusters <- lapply(out, "[[", "clustering")
all.clusters