Как получить доступ к атрибутам дендрограммы в R

Из дендрограммы, которую я создал с помощью

hc<-hclust(kk)
hcd<-as.dendrogram(hc)

я выбрал подветку

k=hcd[[2]][[2]][[2]][[2]][[2]][[2]][[2]][1]

Когда у меня просто отображается k, это дает:

> k
[[1]]
[[1]][[1]]
[1] 243
attr(,"label")
[1] "NAfrica_002"
attr(,"members")
[1] 1
attr(,"height")
[1] 0
attr(,"leaf")
[1] TRUE

[[1]][[2]]
[1] 257
attr(,"label")
[1] "NAfrica_016"
attr(,"members")
[1] 1
attr(,"height")
[1] 0
attr(,"leaf")
[1] TRUE

attr(,"members")
[1] 2
attr(,"midpoint")
[1] 0.5
attr(,"height")
[1] 37

Как я могу получить доступ, например, к атрибуту "midpoint" или ко второму из атрибутов "label"?

(Надеюсь, я использую правильную терминологию здесь)

Я пробовал такие вещи, как

k$midpoint
attr(k,"midpoint")

но оба вернули «NULL».

Извините за вопрос номер 2: как я могу добавить атрибут «метка» после атрибута «средняя точка»?


person user1479670    schedule 07.10.2014    source источник
comment
Если бы вы использовали k=hcd[[2]][[2]][[2]][[2]][[2]][[2]][[2]][[1]], вы бы получили только содержимое, а не упаковывали его в список.   -  person IRTFM    schedule 07.10.2014


Ответы (2)


Ваш k все еще похоронен на один слой слишком глубоко. Атрибуты были установлены для первого элемента списка k.

 attributes(k[[1]]) # Display attributes
 attributes(k[[1]])$label # Access attributes
 attributes(k[[1]])$label <- 'new' # Change attribute

В качестве альтернативы вы можете использовать attr:

attr(k[[1]],'label') # Display attribute
person nograpes    schedule 07.10.2014

Вы можете изменить параметры вручную, как в предыдущем ответе. Проблема в том, что неэффективно делать это вручную, когда вы хотите сделать это много раз. Кроме того, несмотря на простоту изменения параметров, это изменение не может быть отражено ни в какой другой функции, поскольку они не будут выполнять никаких действий на основе этого изменения (это должно быть запрограммировано).

Для вашего конкретного вопроса - это обычно зависит от того, какой атрибут мы хотим просмотреть. Для "midpoint" используйте функцию get_nodes_attr, с параметром "midpoint" - из dendextend пакет.

# install.packages("dendextend")
library(dendextend)

dend <- as.dendrogram(hclust(dist(USArrests[1:5,])))
# Like: 
# dend <- USArrests[1:5,] %>% dist %>% hclust %>% as.dendrogram

# midpoint for all nodes
get_nodes_attr(dend, "midpoint")

И вы получаете это:

[1] 1.25   NA 1.50 0.50   NA   NA 0.50   NA   NA

Чтобы также изменить атрибут, вы можете использовать различные функции назначения из пакета: assign_values_to_leaves_nodePar, assign_values_to_leaves_edgePar, assign_values_to_nodes_nodePar, assign_values_to_branches_edgePar, remove_branches_edgePar, remove_nodes_nodePar

Если все, что вы хотите, это изменить метки, следующая возможность из пакета решит ваш вопрос:

> labels(dend)
[1] "Arkansas"   "Arizona"    "California" "Alabama"    "Alaska"    
> labels(dend) <- 1:5
> labels(dend)
[1] 1 2 3 4 5

Для получения более подробной информации о пакете вы можете посмотреть в его виньетке. .

person Tal Galili    schedule 31.01.2015