Ns

Rのカット樹状図からラベルメンバーシップ/分類を抽出します(つまり、樹状図のカトリー関数)



Extract Labels Membership Classification From Cut Dendrogram R I



解決:

私はあなたに使用することを提案しますからのcutree関数 dendextend パッケージ。樹状図法が含まれています(例:dendextend ::: cutree.dendrogram)。

パッケージの詳細については、入門用のビネットをご覧ください。



私はあなたの関数の間にそれを追加する必要があります(分類)は良いです、使用するためのいくつかの利点がありますカトリーから dendextend

  1. また、特定のを使用することができますk(クラスターの数)だけでなくh(特定の高さ)。



  2. これは、hclustのcutreeから得られる結果と一致しています(分類はされません)。

  3. 多くの場合、より高速になります。

コードの使用例は次のとおりです。



#おもちゃのデータ:hc<- hclust(dist(USArrests), 'ave') dend1 <- as.dendrogram(hc) # Get the package: install.packages('dendextend') library(dendextend) # Get the package: cutree(dend1,h=70) # it now works on a dendrogram # It is like using: dendextend:::cutree.dendrogram(dend1,h=70)  

ちなみに、この機能に基づいて、 dendextend 樹状図の切り取りに基づく色の枝/ラベルなど、ユーザーがよりクールなことを実行できるようにします。

dend1<- color_branches(dend1, k = 4) dend1 <- color_labels(dend1, k = 5) plot(dend1)  

ここに画像の説明を入力してください

最後に、他のポイントを示すためのコードをいくつか示します。

#これはk:cutree(dend1、k = 4)#でも機能し、hclustのcutreeと同じ結果になります:sidentity(cutree(hc、h = 70)、cutree(dend1、h = 70))#TRUE#ただし、これは分類には当てはまりません。同一(classify(dend1,70)、cutree(dend1、h = 70))#FALSE install.packages( 'microbenchmark')require(microbenchmark)microbenchmark(classify = classify(dend1,70) )、cutree = cutree(dend1、h = 70))#単位:ミリ秒#expr min lq median uq max neval#分類9.70135 9.94604 10.25400 10.87552 80.82032 100#cutree 37.24264 37.97642 39.23095 43.21233 141.13880 100#このツリーでは4倍高速(it大きな木ではもっと大きくなります)#(正確には)cutree.dendrogramにhclustを通過させない場合(「奇妙な」木で発生する可能性があります)、速度は同じままです:microbenchmark(classify = classify (dend1,70)、cutree = cutree(dend1、h = 70、try_cutree_hclust = FALSE))#単位:ミリ秒#expr min lq median uq max neval#分類9.683433 9.819776 9.972077 10.48497 2 9.73285 100#カトリー10.275839 10.419181 10.540126 10.66863 16.54034 100

この機能を改善する方法を考えている場合は、ここからパッチを適用してください。

https://github.com/talgalili/dendextend/blob/master/R/cutree.dendrogram.R

あなたや他の人がこの答えがお役に立てば幸いです。


私はそれを使用してそれを行うための関数を作成することになりました樹状に。エレガントではありませんが、機能します

分類する<- function(dendrogram,height){ #mini-function to use with dendrapply to return tip labels members <- function(n) { labels<-c() if (is.leaf(n)) { a <- attributes(n) labels<-c(labels,a$label) } labels } dend2 <- cut(dendrogram,height) #the cut dendrogram object branchesvector<-c() membersvector<-c() for(i in 1:length(dend2$lower)){ #for each lower tree resulting from the cut memlist <- unlist(dendrapply(dend2$lower[[i]],members)) #get the tip lables branchesvector <- c(branchesvector,rep(i,length(memlist))) #add the lower tree identifier to a vector membersvector <- c(membersvector,memlist) #add the tip labels to a vector } out<-as.integer(branchesvector) #make the output a list of named integers, to match cut() output names(out)<-membersvector out }  

この関数を使用すると、cutreeがブランチ名を左から右に割り当てるのに対し、cutはカテゴリ名をアルファベット順に割り当てるという問題があることが明らかになります。

hc<- hclust(dist(USArrests), 'ave') dend1 <- as.dendrogram(hc) classify(dend1,70) #Florida 1, North Carolina 1, etc. cutree(hc,h=70) #Alabama 1, Arizona 1, Arkansas 1, etc.