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

Posted

技术标签:

【中文标题】保存由 for 循环产生的不同对象【英文标题】:save different objects resulting from a for loop 【发布时间】:2015-12-15 17:32:43 【问题描述】:

我正在尝试。

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

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”

我已尝试查看其他问题/回复,但我不明白该怎么做...

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

【问题讨论】:

没有ont.Obs这样的列。 我犯了一个错误@RomanLuštrik。我已经用“Obs”更新了脚本 【参考方案1】:

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

【讨论】:

感谢@Roman Luštrik 的回复。 1)我已经从矩阵中消除了变量 ID,只让数据框中的行名,但我仍然在第一个命令('do.call')处遇到问题。随机观察矩阵自动获取“站点”作为行名。 2) out[[i]] 是如何精确计算的?我不清楚。再次感谢! 您必须保留 ID 以保持您的行可追溯。我创建一个包含与行数一样多的元素的空列表,并在每个元素中添加一个额外的列表(rnd.dfclusteringgrps.iter)。 成功了!非常感谢@Roman Luštrik 只是为了清楚其他人是否需要它:out[[i]] &lt;- list(rnd = rnd.df, clustering = clustering, grps = grps.iter) 中的“=”的第一个元素可以更改为任何名称。第二个必须与我们要提取的元素一致。然后保存元素:all.grps.iter &lt;- lapply(out, "[[", "grps") all.grps.iter capture.output(all.grps.iter,file="all.grps.iter.txt") # as text file write.csv(all.grps.iter, file="all.grps.iter.csv") # as csv file

以上是关于保存由 for 循环产生的不同对象的主要内容,如果未能解决你的问题,请参考以下文章

在 for 循环中使用不同的名称保存模型预测

Swift 中的核心数据:仅在 for 循环中保存最后一个对象

带有 ggplots 的 for 循环生成具有相同值但标题不同的图形

matlab 如何将for每循环一次产生的矩阵合并成一个大矩阵

在 for 循环中保存动态命名的变量

具有不同文件名的 for 循环中的 DataFrame 到 CSV