我有一个很长的列表e2i,它将rownames“映射”为值,并且具有重复的rownames:
> head(e2i)
$`679594`
[1] "IPR019956"
$`679594`
[1] "IPR019954"
$`679594`
[1] "IPR019955"
$`679594`
[1] "IPR000626"
$`682397`
[1] "IPR019956"
$`682397`
[1] "IPR019954"
我需要将其转换为具有唯一rownames的列表,其中每个命名元素都是(命名或未命名)值的列表:
> 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
答案 0 :(得分:2)
你看过reshape包吗?
或者只使用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"