首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GRanges作为base::data.frame中的列

GRanges作为base::data.frame中的列
EN

Stack Overflow用户
提问于 2019-12-17 08:44:33
回答 3查看 2.8K关注 0票数 2

我想将生物导体中的GenomicRanges::GRanges对象存储为基R data.frame中的一列。我之所以想把它放在一个基本的R data.frame中,是因为我想编写一些ggplot2函数,这些函数专门用于引擎盖下的data.frames。然而,我所做的任何尝试似乎都是徒劳的。基本上,这就是我想做的:

代码语言:javascript
复制
library(GenomicRanges)

x <- GRanges(c("chr1:100-200", "chr1:200-300"))

df <- data.frame(x = x, y = 1:2)

但是该列是自动展开的,而我喜欢将它作为一个有效的GRanges对象保存在一个列中:

代码语言:javascript
复制
> df
  x.seqnames x.start x.end x.width x.strand y
1       chr1     100   200     101        * 1
2       chr1     200   300     101        * 2

当我使用S4Vectors::DataFrame时,它的工作原理是我想要的,除了我希望一个基本的R data.frame做同样的事情:

代码语言:javascript
复制
> S4Vectors::DataFrame(x = x, y = 1:2)
DataFrame with 2 rows and 2 columns
             x         y
     <GRanges> <integer>
1 chr1:100-200         1
2 chr1:200-300         2

我也尝试了以下没有成功的方法:

代码语言:javascript
复制
> df <- data.frame(y = 1:2)
> df[["x"]] <- x
> df
  y                                                           x
1 1 <S4 class ‘GRanges’ [package “GenomicRanges”] with 7 slots>
2 2                                                        <NA>

警告消息:在format.data.frame(如果(省略) xseq_len(n0) )中,drop = FALSE or,:损坏的数据帧:列将被截断或填充NAs

代码语言:javascript
复制
df[["x"]] <- I(x)

rep中的错误(value,length.out =nrow):尝试复制'S4‘类型的对象

我在使用S3实现GRanges类的一个变体方面取得了一些小小的成功,但这似乎是一种非常简单的方法,可以得到一列代表基因组范围的列。

EN

回答 3

Stack Overflow用户

发布于 2021-04-14 00:39:24

我找到了一种非常简单的方法,可以将GR对象转换为data.frame,以便您可以非常容易地对data.frame进行操作。Repitools包中的https://rdrr.io/bioc/Repitools/man/annoGR2DF.html函数可以做到这一点。

代码语言:javascript
复制
> library(GenomicRanges)
> library(Repitools)
> 
> x <- GRanges(c("chr1:100-200", "chr1:200-300"))
> 
> df <- annoGR2DF(x)
> df
   chr start end width
1 chr1   100 200   101
2 chr1   200 300   101
> class(df)
[1] "data.frame"
票数 3
EN

Stack Overflow用户

发布于 2019-12-17 16:31:03

一个不太好但实用的解决方案是使用GenomicRanges的访问函数,然后转换成相关的数据向量,即数字或字符。我添加了magrittr,但你也可以不使用它。

代码语言:javascript
复制
library(GenomicRanges)
library(magrittr)

x <- GRanges(c("chr1:100-200", "chr1:200-300"))
df <- data.frame(y = 1:2)
df$chr <- seqnames(x) %>% as.character
df$start <- start(x) %>% as.numeric
df$end <- end(x) %>% as.numeric
df$strand <- strand(x) %>% as.character
df$width <- width(x) %>% as.numeric
df
票数 0
EN

Stack Overflow用户

发布于 2020-01-27 16:37:45

因此,在发布这个问题之后,我发现问题的症结似乎在于,仅仅是S4对象的格式方法没有很好地处理data.frames,而将GRanges作为列并不一定是一个问题。(不过,data.frame的建设仍在继续)。

考虑一下原来问题的这一点:

代码语言:javascript
复制
> df <- data.frame(y = 1:2)
> df[["x"]] <- x
> df
  y                                                           x
1 1 <S4 class ‘GRanges’ [package “GenomicRanges”] with 7 slots>
2 2   

警告消息:在format.data.frame(如果(省略) xseq_len(n0) )中,drop = FALSE or,:损坏的数据帧:列将被截断或填充NAs

如果我们为GRanges编写一个简单的格式方法,它将不会引发错误:

代码语言:javascript
复制
library(GenomicRanges)

format.GRanges <- function(x, ...) {showAsCell(x)}

df <- data.frame(y = 1:3)

df$x <- GRanges(c("chr1:100-200", "chr1:200-300", "chr2:100-200"))
代码语言:javascript
复制
> df
  y            x
1 1 chr1:100-200
2 2 chr1:200-300
3 3 chr2:100-200

它似乎也很好:

代码语言:javascript
复制
> df[c(1,3),]
  y            x
1 1 chr1:100-200
3 3 chr2:100-200

作为一种奖励,这似乎也适用于其他S4类,例如:

代码语言:javascript
复制
library(S4Vectors)

format.Rle <- function(x, ...) {showAsCell(x)}

x <- Rle(1:5, 5:1)

df <- data.frame(y = 1:15)
df$x <- x
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59370461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档