保存由 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
我正在尝试保存由 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