我有一个列表对象,如下所示:
str(regul))
List of 656
$ 10001 :List of 2
..$ tfmode : Named num [1:168] 0.994 0.992 -0.743 0.906 0.683 ...
.. ..- attr(*, "names")= chr [1:168] "22938" "5684" "9780" "11339" ...
..$ likelihood: num [1:168] 0.998 0.993 0.936 0.966 0.482 ...
$ 10011 :List of 2
..$ tfmode : Named num [1:88] 1 1 0.999 1 1 ...
.. ..- attr(*, "names")= chr [1:88] "3035" "4695" "113829" "5201" ...
..$ likelihood: num [1:88] 1 1 1 1 1 ...
我想创建一个如下所示的2列矩阵:
head(newRegul)
TF Target
10001 22938
10001 5684
10001 9780
...
10011 3035
10011 4695
...
因此,将有168行,其中第一列是“10001”,第二列包含匹配的regul $ tfmode的名称,接着是88行,其中第1列由10011&第2列由其匹配的regul $ tfmode名称等组成。
我一直在尝试这样做,使用unlist()和字符串拆分,但是遇到了很多问题。有一些简单的(ish)方法吗?
如果这是一个重复的问题,感谢和抱歉。如果是,请发布链接&我会删除这篇文章。
答案 0 :(得分:1)
我们可以使用melt
library(reshape2)
library(reshape2)
melt(lapply(regul, function(x) names(x[[1]])))
# value L1
#1 22938 10001
#2 5564 10001
#3 1123 10011
#4 1533 10011
或者我们可以将stack
与transpose
中的library(purrr)
结合使用
library(purrr)
library(dplyr)
transpose(regul) %>%
.$tfmode %>%
map(names) %>%
stack
# values ind
#1 22938 10001
#2 5564 10001
#3 1123 10011
#4 1533 10011
regul <- list(`10001`=list(tfmode= setNames(c(0.994,
0.992), c(22938, 5564)), likelihood=c(0.998, 0.834)),
`10011`=list(tfmode=setNames(c(0.7, 0.3), c(1123,
1533)), likelihood= c(0.4, 0.3)))