当我应用某些建模技术时,我想自动化结果创建过程.因此,我将使用不同的参数(例如,层次聚类距离和链接方法).结果将具有矩阵形式,以便我可以通过指定模型参数(例如,单个,欧几里德)来访问单个结果.在数据框中,我可以命名列和行,并简单地访问元素df[rname[1],cname[1]].到目前为止,我读到它不可能使用数据框对象来存储列表结果.所以我需要列表来存储列表结果.但在列表中,我只能指定lst$cname[1]而不是两个维度.我对么?
# data frame layout for numeric results does not work with list results
rname<-c("u","v","w")
cname<-c("ave","single")
# dataframe for results but does not work for results which are lists
paste.1<-function(x,y) paste(x,y,sep=".")
df1<-data.frame(lapply(cname,paste.1,x=rname),row.names=rname)
colnames(df1)<-cname
# creating list for results - do not get a good idea to proceed from here Advices??
lst<-(lapply(cname,paste.1,x=rname))
names(lst)<-cname
# results example - could be anything else
# with a dataframe I could use df1[rname,cname]<-foo(rname,cname)
# with lists I guess its not as easy
require(graphics)
ave.u <- hclust(dist(USArrests,"euclidean"), cname[1])
ave.v <- hclust(dist(USArrests,"maximum"), cname[1])
ave.w <- hclust(dist(USArrests,"manhattan"), cname[1])
single.u <- hclust(dist(USArrests,"euclidean"), cname[2])
single.v <- hclust(dist(USArrests,"maximum"), cname[2])
single.w <- hclust(dist(USArrests,"manhattan"), cname[2])
Run Code Online (Sandbox Code Playgroud)
好吧,我不确定是否有一个我认为必须存在的解决方案.最后,我只想通过行名和列名访问列表结果.我知道我可以将行/列名称转换为数字名称然后播放指定正确的索引以在length(rname)x length(cname)列表中查找我的结果但是由于数据框很好用,我假设它必须是一种简单的方式来存储它更加用户友好.可能也是这样的情况,因为我刚刚开始使用R,所以我并没有真正理解列表的概念.所以我的问题是:存储结构化结果(列表)的好策略是什么?用R?
可以有一个列表矩阵:
nr <- length(rname)
nc <- length(cname)
m <- matrix(list(), nr, nc, dimnames = list(rname, cname))
m[["u", "ave"]] <- ave.u
# etc.
Run Code Online (Sandbox Code Playgroud)
例如,形成行名称rnm和列名称 ,以及它们值的所有组合的cnm数据框。g然后创建一个列表矩阵m:
rnm <- c("euclidean", "maximum", "manhattan")
cnm <- c("ave", "single")
g <- expand.grid(rnm, cnm)
f <- function(i) hclust(dist(USArrests, g[i,1]), g[i,2])
m <- matrix(lapply(1:nrow(g), f), length(rnm), dimnames = list(rnm, cnm))
Run Code Online (Sandbox Code Playgroud)
我们可以这样访问元素:
> m[["euclidean", "single"]]
Call:
hclust(d = dist(USArrests, g[i, 1]), method = g[i, 2])
Cluster method : single
Distance : euclidean
Number of objects: 50
Run Code Online (Sandbox Code Playgroud)