保存由 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.df
、clustering
和 grps.iter
)。
成功了!非常感谢@Roman Luštrik 只是为了清楚其他人是否需要它:out[[i]] <- list(rnd = rnd.df, clustering = clustering, grps = grps.iter)
中的“=”的第一个元素可以更改为任何名称。第二个必须与我们要提取的元素一致。然后保存元素:all.grps.iter <- 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 循环产生的不同对象的主要内容,如果未能解决你的问题,请参考以下文章
Swift 中的核心数据:仅在 for 循环中保存最后一个对象
带有 ggplots 的 for 循环生成具有相同值但标题不同的图形