R:将列表名称转换为矩阵条目

时间:2016-01-12 20:20:20

标签: r list matrix

我有一个列表对象,如下所示:

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)方法吗?

如果这是一个重复的问题,感谢和抱歉。如果是,请发布链接&我会删除这篇文章。

1 个答案:

答案 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

或者我们可以将stacktranspose中的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)))