RDPLYR:将数据帧列表转换为单个有组织的数据帧

RDPLYR:将数据帧列表转换为单个有组织的数据帧,r,dplyr,data-cleaning,R,Dplyr,Data Cleaning,我有一个包含多个条目的列表,示例条目如下所示: > head(gene_sets[[1]]) patient Diagnosis Eigen_gene ENSG00000080824 ENSG00000166165 ENSG00000211459 ENSG00000198763 ENSG00000198938 ENSG00000198886 1 689_120604 AD -0.5606425 50137 38263

我有一个包含多个条目的列表,示例条目如下所示:

> head(gene_sets[[1]])
     patient Diagnosis Eigen_gene ENSG00000080824 ENSG00000166165 ENSG00000211459 ENSG00000198763 ENSG00000198938 ENSG00000198886
1 689_120604        AD -0.5606425           50137           38263          309298          528233          523420          730537
2 412_120503        AD  0.9454632           44536           23333          404316          730342          765963         1168123
3 706_120605        AD  0.6061834           16647           22021          409498          614314          762878         1171747
4 486_120515        AD  0.8164779           21871            9836          518046          697051          613621         1217262
5 469_120514        AD  0.5354927           33460           11651          468223          653745          608259         1115973
6 369_120502        AD -0.8363372           32168           44760          271978          436132          513194          784537
对于这些条目,前三列总是一致的,列的总数也会有所不同

我想做的是将整个列表转换为数据帧。我需要保留的信息是
set_index
作为列表中条目的索引,然后是从beyond
Eigen_gene
到最后一列的所有colname

我可以想到使用循环的解决方案,但是我想要一个
dplyr/reforme
解决方案

为了澄清,如果我们有一个假输入,看起来像:

> list(data.frame(patient= c(1,2,3), Diagnosis= c("AD","Control", "AD"), Eigen_gene= c(1.1, 2.3, 4.3), geneA= c(1,1,1), geneC= c(2,1,3), geneB= c(2,39,458)))
[[1]]
  patient Diagnosis Eigen_gene geneA geneC geneB
1       1        AD        1.1     1     2     2
2       2   Control        2.3     1     1    39
3       3        AD        4.3     1     3   458
所需的输出如下所示(我只展示了输入的第一个列表条目的示例,输出显示了列表中其他条目的格式):


谢谢

以下是来自
tidyverse
purr
的解决方案。我扩展了示例输入以生成示例输出。这里的关键功能是
imap
,它是
map2(x,seq_沿(x))的缩写
。有关更多信息,请参阅。我们要做的是对列表中的每个数据帧及其索引应用一个函数。因此我们使用函数
~tibble(set_index=.y,gene=colnames(.x[4:ncol(.x)])

  • ~
    .x
    .y
    purrr
    函数(x,y)、
    x
    y
    的缩写。这让我们可以简洁地引用函数的参数。请参见
    ?地图2
  • set_index=.y
    创建第一列,并用当前数据帧的索引填充它(它被有效地重复以获得正确的长度)
  • gene=colnames(.x[4:ncol(.x)])
    从基因名向量创建第二列
    colnames
    获取数据帧的变量名,但我们将其子集以排除前三个变量名
  • 如果我们只有
    imap
    ,我们将得到一个数据帧列表。
    imap\u dfr
    只需获取该列表并将它们作为行绑定在一起,即可生成所需的输出。(相当于随后调用
    bind_行
库(tidyverse)
基因列表:8 x 2
#>集合指数基因
#>        
#>1 geneA
#>2.1 geneC
#>3.1 geneB
#>4.2 geneF
#>5.2吉奈
#>6.2吉奈
#>7.3 geneT
#>8 3 geneZ

由(v0.2.0)于2018-03-02创建。

我不清楚您的期望输出与您的样本输入之间的关系。没有重叠的值。在寻求帮助时,您应该包括一个简单的示例输入和所需的输出,可用于测试和验证可能的解决方案。只需给出一个小示例,其中可能包含列表中的3个元素和预期的解决方案。前三列是否始终相同?每个数据框中有不同数量的基因列吗?@CalumYou前三列总是相同的,列表中每个数据框中的列数也不同。@MrFlick我会为你们找出一个更好的例子。样本输出完全是人为设计的,而样本输入是问题的真实输入。我明白这有多令人困惑。
> data.frame(set_index= c(1,1,1,2,2,2,3,3), gene= c("geneA", "geneC", "geneB", "geneF", "geneE", "geneH", "geneT", "geneZ"))
  set_index  gene
1         1 geneA
2         1 geneC
3         1 geneB
4         2 geneF
5         2 geneE
6         2 geneH
7         3 geneT
8         3 geneZ