data.frame的长度不等的字符向量列表

时间:2012-06-28 12:27:37

标签: r list dataframe

我有一个看起来像这样的命名列表:

> head(pathways)
$<NA>
NULL
$`2`
[1] "hsa04610"
$`9`
[1] "hsa00232" "hsa00983" "hsa01100"
$`10`
[1] "hsa00232" "hsa00983" "hsa01100"
$<NA>
NULL
$<NA>
NULL

更多地描述它。每个列表的名称是一个id号,作为列表元素的字符向量的每个元素的条目是另一个id号。我可以使用$<NA>轻松过滤掉is.na()条目,但之后我想更改其余内容,使其看起来像:

id   another_id
2    hsa04610   
9    hsa00232   
9    hsa00983   
9    hsa01100   
10   hsa00232  
10   hsa00983
10   hsa01100


> dput(test)
structure(list(`NA` = NULL, `2` = "hsa04610", `9` = c("hsa00232", 
"hsa00983", "hsa01100"), `10` = c("hsa00232", "hsa00983", "hsa01100"
), `NA` = NULL, `NA` = NULL), .Names = c(NA, "2", "9", "10", 
NA, NA))

有什么想法吗?

3 个答案:

答案 0 :(得分:6)

所以我找到了另一个似乎有用的答案。

stack(pathways)

这似乎太容易了,但是哦。

答案 1 :(得分:2)

因此,如果你有列表l(删除NA后),那么:

another_id <- unlist(l)
id <- rep(names(l), unlist(lapply(l, length)))
data.frame(id, another_id, row.names=NULL)

会给出结果。

答案 2 :(得分:2)

#sample data
pathways <- list(`1` = letters[1:3], `2` = LETTERS[4:5], `3` = 6:9, `4` = NULL)

#a solution
n <- vapply(pathways, length, integer(1))
id <- rep.int(names(pathways), n)
another_id <- unlist(pathways, use.names = FALSE)
data.frame(id = id, another_id = another_id)