我想将生物导体中的GenomicRanges::GRanges对象存储为基R data.frame中的一列。我之所以想把它放在一个基本的R data.frame中,是因为我想编写一些ggplot2函数,这些函数专门用于引擎盖下的data.frames。然而,我所做的任何尝试似乎都是徒劳的。基本上,这就是我想做的:
library(GenomicRanges)
x <- GRanges(c("chr1:100-200", "chr1:200-300"))
df <- data.frame(x = x, y = 1:2)但是该列是自动展开的,而我喜欢将它作为一个有效的GRanges对象保存在一个列中:
> 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做同样的事情:
> 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我也尝试了以下没有成功的方法:
> 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
df[["x"]] <- I(x)rep中的错误(value,length.out =nrow):尝试复制'S4‘类型的对象
我在使用S3实现GRanges类的一个变体方面取得了一些小小的成功,但这似乎是一种非常简单的方法,可以得到一列代表基因组范围的列。
发布于 2021-04-14 00:39:24
我找到了一种非常简单的方法,可以将GR对象转换为data.frame,以便您可以非常容易地对data.frame进行操作。Repitools包中的https://rdrr.io/bioc/Repitools/man/annoGR2DF.html函数可以做到这一点。
> 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"发布于 2019-12-17 16:31:03
一个不太好但实用的解决方案是使用GenomicRanges的访问函数,然后转换成相关的数据向量,即数字或字符。我添加了magrittr,但你也可以不使用它。
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发布于 2020-01-27 16:37:45
因此,在发布这个问题之后,我发现问题的症结似乎在于,仅仅是S4对象的格式方法没有很好地处理data.frames,而将GRanges作为列并不一定是一个问题。(不过,data.frame的建设仍在继续)。
考虑一下原来问题的这一点:
> 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编写一个简单的格式方法,它将不会引发错误:
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"))> df
y x
1 1 chr1:100-200
2 2 chr1:200-300
3 3 chr2:100-200它似乎也很好:
> df[c(1,3),]
y x
1 1 chr1:100-200
3 3 chr2:100-200作为一种奖励,这似乎也适用于其他S4类,例如:
library(S4Vectors)
format.Rle <- function(x, ...) {showAsCell(x)}
x <- Rle(1:5, 5:1)
df <- data.frame(y = 1:15)
df$x <- xhttps://stackoverflow.com/questions/59370461
复制相似问题