我有一个数据框,我分成不同的子集。基于此我生成序列列表和 距离矩阵,然后是层次聚类分析。
library(TraMineR)
library(WeightedCluster)
library(cluster)
data(mvad)
value1 <- min(grep('\\d{2}$', names(mvad)))
value2 <- max(grep('\\d{2}$', names(mvad)))
mvad.split <- split(mvad, f=mvad$male)
mvad.seq <- lapply(mvad.split, function(x){seqdef(x[value1:value2])})
mvad.om <- lapply(mvad.seq, function(x){seqdist(x, method='OM',
indel=1, sm='TRATE')})
mvad.dis <- lapply(mvad.om, function(x){as.dist(x)})
mvad.hc <- lapply(mvad.dis, function(x){hclust(x,
method='ward.D2')})
然后我想将我的层次聚类列表转换为带有序列数据和距离的seqtree列表
mvad.tree <- lapply(mvad.hc, function(x){as.seqtree(x,
seqdata=mvad.seq[[x]],
diss=mvad.dis[[x]],
weighted=F,
nclust=6)})
获得Error in mvad.dis[[x]] : invalid subscript type 'list'
。
我的实际数据包含许多同类群组,并且使用split()和lapply()可以节省大量时间。有什么建议吗?
答案 0 :(得分:0)
在最后lapply
内,每个元素来自mvad.hc
中的一个节点,因此是hclust对象。您不希望在此列表中lapply
,而是在名称列表上获取相应的对象。类似的东西:
mvad.tree <- lapply(as.list(names(mvad.hc)), FUN=function(name){
as.seqtree(mvad.hc[[name]],seqdata=mvad.seq[[name]],
diss=mvad.dis[[name]],weighted=F,nclust=6)})
}
未经测试,因为我们没有数据(参见评论)。