Как преобразовать список с неуникальными именами строк в (вложенный) список с уникальными именами строк? - PullRequest
2 голосов
/ 23 августа 2010

У меня есть длинный список e2i, который «отображает» имена строк на значения и имеет повторяющиеся имена строк:

> head(e2i)
$`679594`
[1] "IPR019956"

$`679594`
[1] "IPR019954"

$`679594`
[1] "IPR019955"

$`679594`
[1] "IPR000626"

$`682397`
[1] "IPR019956"

$`682397`
[1] "IPR019954"

Мне нужно преобразовать его в список с уникальными именами строк, где каждый именованный элемент будетсписок (именованных или неназванных) значений:

> str(mylist)
List of 2
 $ 679594:List of 3
  ..$ : chr "IPR019956"
  ..$ : chr "IPR019954"
  ..$ : chr "IPR019955"
 $ 682397:List of 2
  ..$ : chr "IPR019956"
  ..$ : chr "IPR019954"

Я считаю, что есть короткое и элегантное решение.

Что касается длинного и некрасивого решения - я думаю, что я мог бы сделать это с помощьюЦикл, подобный следующему:

mytest = function(e2i) {
    result = list()
    for (e in names(e2i)) {
            # iterate all rownames, including duplicates
            if (e %in% names(result)) {
                    # convert existing element to a list (if not already a list),
                    # then append new value e2i[[e]] to that nested list
            }
            else {
                    # just add the value to the result
                    result = c(result, e2i[[e]])
            }
    }
    return(result)
}

Первоначально данные были в матрице, и для моего проекта решения цикла выше, я использовал бы его в качестве ввода:

> head(entrez2interpro_matrix)
  EntrezGene.ID Interpro.ID
1        679594   IPR019956
2        679594   IPR019954
3        679594   IPR019955
4        679594   IPR000626
5        682397   IPR019956
6        682397   IPR019954

1 Ответ

2 голосов
/ 23 августа 2010

Вы смотрели на форму пакета?

Или просто используете unstack():

> d
  EntrezGene.ID Interpro.ID
1        679594   IPR019956
2        679594   IPR019954
3        679594   IPR019955
4        679594   IPR000626
5        682397   IPR019956
6        682397   IPR019954
> unstack(d, Interpro.ID ~ EntrezGene.ID)
$`679594`
[1] "IPR019956" "IPR019954" "IPR019955" "IPR000626"

$`682397`
[1] "IPR019956" "IPR019954"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...