R 重塑然后折叠数据帧

R 重塑然后折叠数据帧,r,dataframe,dplyr,tidyr,reshape2,R,Dataframe,Dplyr,Tidyr,Reshape2,正在努力将杂乱无章、长度不等的数据.frame从宽表转换为长表,然后为新变量折叠(汇总)。目前看起来是这样的,将Gene作为一个变量,将GO\u terms作为一个包含多个逗号分隔值的变量: Gene GO_terms AA1006G00001 GO:0098655, GO:0008643, GO:0005351, GO:0005886, GO:0016021 AA100G00001 GO:00986

正在努力将杂乱无章、长度不等的
数据.frame
从宽表转换为长表,然后为新变量折叠(汇总)。目前看起来是这样的,将
Gene
作为一个变量,将
GO\u terms
作为一个包含多个逗号分隔值的变量:

Gene            GO_terms                        
AA1006G00001    GO:0098655, GO:0008643, GO:0005351, GO:0005886, GO:0016021      
AA100G00001     GO:0098655, GO:0009944, GO:0009862, GO:0010075, GO:0010014, GO:0009855, GO:0010310
AA100G00002     GO:0098655, GO:0008643, GO:0005886
我想做的第一步是转换为“long”格式,所以看起来像这样:

Gene            GO_terms 
AA1006G00001    GO:0098655
AA1006G00001    GO:0008643
AA1006G00001    GO:0005351
AA1006G00001    GO:0005886
AA1006G00001    GO:0016021
AA100G00001     GO:0001666
AA100G00001     GO:0009944
AA100G00001     GO:0009862
AA100G00001     GO:0010075
AA100G00001     GO:0010014
AA100G00001     GO:0009855
AA100G00001     GO:0010310
AA100G00002     GO:0008270
AA100G00002     GO:0005634
AA100G00002     GO:0005886
AA100G00003     GO:0005488
AA100G00003     GO:0005634
然后,我希望通过切换两个变量来重新组织这个
数据表
,因为它被整理如下:

GO_terms    Genes
GO:0005351  AA1006G00001        
GO:0005886  AA1006G00001,   AA100G00002 
GO:0008643  AA1006G00001,   AA100G00002 
GO:0009855  AA100G00001     
GO:0009862  AA100G00001     
GO:0009944  AA100G00001     
GO:0010014  AA100G00001     
GO:0010075  AA100G00001     
GO:0010310  AA100G00001     
GO:0016021  AA1006G00001        
GO:0098655  AA1006G00001,   AA100G00001,      AA100G00002
包含基因的变量可以在一列内(使用逗号分隔的值),也可以在多列中

有谁能提供
tidyr
reformae2
dplyr
解决方案吗

编辑:
dput()
表是:

structure(list(`Gene    ` = c("AA1006G00001\t", "AA100G00001\t", 
"AA100G00002\t"), `GO_terms                     ` = c("GO:0098655, GO:0008643, GO:0005351, GO:0005886, GO:0016021\t\t", 
"GO:0098655, GO:0009944, GO:0009862, GO:0010075, GO:0010014, GO:0009855, GO:0010310", 
"GO:0098655, GO:0008643, GO:0005886")), row.names = c(NA, -3L
), class = c("tbl_df", "tbl", "data.frame"), spec = structure(list(
    cols = list(`Gene   ` = structure(list(), class = c("collector_character", 
    "collector")), `GO_terms                        ` = structure(list(), class = c("collector_character", 
    "collector"))), default = structure(list(), class = c("collector_guess", 
    "collector"))), class = "col_spec"))

看来你正在做一些围棋分析。您可以从
topGO
尝试
inverseList
(Bioconductor中用于GO分析的最流行的R软件包之一):

库(topGO)

gene.to.go这是一种tidyr和dplyr解决方案:

library(tidyr)
library(dplyr)

#allow up to seven Genes per GO_term if there is more increase the letters expression
long<-df %>% separate(GO_terms, into=paste0("a", 1:100), sep=", ", extra="merge") %>% 
  gather( key="key", value="GO_terms", -Gene)

#filter data frame, remove the NA and keep the desired columns
long<-long[!is.na(long$GO_terms), c("Gene", "GO_terms")]

final<-long %>% group_by(GO_terms) %>% summarize( Gene=toString(Gene) )
library(tidyr)
图书馆(dplyr)
#如果有更多的基因增加字母表达,每个GOU术语最多允许7个基因
长%separate(gou_术语,into=paste0(“a”,1:100),sep=“,”,extra=“merge”)%%>%
聚集(key=“key”、value=“GO\u terms”、-Gene)
#筛选数据框,删除NA并保留所需的列
长%summary(基因=toString(基因))

到目前为止,您尝试了什么?你坚持到什么地步?我想这里面有很多关于你每个部分问题的答案。你能按实际情况发布第一个数据帧吗,就像
dput
?这将更有帮助,因为您正在处理复制和粘贴无法解决的结构问题text@AndreElrico我尝试先用列分隔GO_术语,然后使用
Gene
变量尝试melt()。结果不正确,有许多空白值(因为我的GO_术语长度不等?)。谢谢@mt1022!你说得对——我正在做一些围棋分析。我使用
readMappings
导入了数据,然后使用
inverseList
将其反转。它似乎不想导出为表。知道为什么吗?啊,将新的倒置对象重新分配到
data.table
!非常感谢您的帮助@mt1022!谢谢,@Dave2e。奇怪的是,这种方法产生了5963个唯一的GO_项,而@mt1022在
TopGo
中反转
映射的方法产生了5994个唯一的GO_项。古怪的有什么想法吗?是的,当然,我只上传了一小部分的
数据。表
就是为了这样!将
改为=letters
参数为
1:100
(我知道我的GO_术语的最大数目是56)仍然会产生相同的数目。@WaheedArshad有56个元素,我完全低估了这一个元素。我编辑了上面的代码,以允许多达100个不同的GO_术语。以前的版本只接受前26个。你是明星,@Dave2e!非常感谢–非常感谢!
library(tidyr)
library(dplyr)

#allow up to seven Genes per GO_term if there is more increase the letters expression
long<-df %>% separate(GO_terms, into=paste0("a", 1:100), sep=", ", extra="merge") %>% 
  gather( key="key", value="GO_terms", -Gene)

#filter data frame, remove the NA and keep the desired columns
long<-long[!is.na(long$GO_terms), c("Gene", "GO_terms")]

final<-long %>% group_by(GO_terms) %>% summarize( Gene=toString(Gene) )