как создать вложенный список из data.frame, конвертируемого в класс дендрограммы - PullRequest
0 голосов
/ 16 октября 2018

У меня есть очень специфическая структура data.frame, содержащая данные о происхождении клеток, которые мне нужно преобразовать во вложенные списки структуры дендрограммы, чтобы построить результирующие деревья и цветные листы с помощью пакета dendextend.

Мои данные имеютследующая структура:

Mother    Daughter     MotherLifeTime  Var
A         Aa           10              8
A         Ab           10              8
Aa        Aaa          11              2
Aa        Aab          11              2
Ab        Aba          12              4
Ab        Abb          12              4
Aba       NA           15              6
Abb       NA           14              7
Aaa       NA           16              7
Aab       NA           15              9

У каждой Матери обычно есть две Дочери, у конечных ветвей нет ни одной.Длина веток указывается MotherLifetime.У каждой ячейки есть некоторое измерение, связанное с ней в переменной Var, которое я хочу использовать для окрашивания или маркировки ветвей.

df <- data.frame(Mother=c("A","A","Aa","Aa","Ab","Ab","Aba","Abb","Aaa","Aab"),
             Daugther=c("Aa","Ab","Aaa","Aab","Aba","Abb",NA,NA,NA,NA),
             MotherLifeTime=c(10,10,11,11,12,12,15,14,16,15), 
             Var=c(8,8,2,2,4,4,6,7,7,9))

Я хочу преобразовать этот data.frame в объект класса дендрограммы - то есть список списков с атрибутами.Структура будет выглядеть примерно так:

library(dendextend)
dend <- c(1:4) %>% dist %>% hclust %>% as.dendrogram
labels(dend)  <- c("Aaa","Aab","Aba","Abb")
dend %>% unclass %>% str

Структура будет выглядеть примерно так (здесь нет корня A, а ветви не имеют правильной длины)

List of 2
 $ :List of 2
  ..$ : int 1
  .. ..- attr(*, "label")= chr "Aaa"
  .. ..- attr(*, "members")= int 1
  .. ..- attr(*, "height")= num 0
  .. ..- attr(*, "leaf")= logi TRUE
  ..$ : int 2
  .. ..- attr(*, "label")= chr "Aab"
  .. ..- attr(*, "members")= int 1
  .. ..- attr(*, "height")= num 0
  .. ..- attr(*, "leaf")= logi TRUE
  ..- attr(*, "members")= int 2
  ..- attr(*, "midpoint")= num 0.5
  ..- attr(*, "height")= num 1
 $ :List of 2
  ..$ : int 3
  .. ..- attr(*, "label")= chr "Aba"
  .. ..- attr(*, "members")= int 1
  .. ..- attr(*, "height")= num 0
  .. ..- attr(*, "leaf")= logi TRUE
  ..$ : int 4
  .. ..- attr(*, "label")= chr "Abb"
  .. ..- attr(*, "members")= int 1
  .. ..- attr(*, "height")= num 0
  .. ..- attr(*, "leaf")= logi TRUE
  ..- attr(*, "members")= int 2
  ..- attr(*, "midpoint")= num 0.5
  ..- attr(*, "height")= num 1
 - attr(*, "members")= int 4
 - attr(*, "midpoint")= num 1.5
 - attr(*, "height")= num 3

Спасибо за любыесовет.

Радек

...