在WeightedCluster中使用lapply的无效下标类型'list'

时间:2016-07-05 12:34:57

标签: r lapply traminer

我有一个数据框,我分成不同的子集。基于此我生成序列列表和 距离矩阵,然后是层次聚类分析。

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()可以节省大量时间。有什么建议吗?

1 个答案:

答案 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)})
}

未经测试,因为我们没有数据(参见评论)。