GRs are a great data structure. But, standard bioinformatic file formats
(BED, WIG, BAM) don't always fit 1:1 with the "organic" beginnings of some
projects. The GenomicRanges infrastructure isn't on the radar of every R
developer, and some useful data can be found in ugly formats. Wouldn't it
be handy if users could easily turn those blobs of data into something that
export() can handle?
To better understand Michael's point of view, and as someone who has seen
firsthand the nontrivial amount of work required to maintain rtracklayer as
a high-performance import library, I wrote a few trivial Perl scripts to
convert some mouse data from assorted wacky tabular formats to standard
BED6 files. Besides, once I have BEDs, I can Tabix them, which speeds up
operations.
I noticed that, when I imported the resulting BED files, where I had
cloned the base position into identical "chromStart" and "chromEnd"
coordinates, the import.bed() function assumed that I meant for them to be
UCSC-style, and therefore gave everything negative widths. (On the bright
side, this also explained why liftOver wasn't doing anything useful with
the results)
packageVersion('rtracklayer')
## [1] '1.21.12'
wacky <- import('converted.theirSillyFormat.mm9.bed.gz', genome='mm9')
mm9toHg19 <- import('mm9ToHg19.over.chain')
empty <- liftOver(wacky, mm9toHg19)
length(unlist(empty))/length(wacky)
## [1] 0
## cursing ensues
That's not so good. If I wasn't already aware of the insanity of
UCSC-style indexing, this could have been a problem in and of itself. (As
it was, I fixed it)
slow <- read.table('theirSillyFormat.mm9.txt.gz')
## time passes...
aGR <- df2GR(slow)
mm9toHg19 <- import('mm9ToHg19.over.chain')
full <- liftOver(slow, mm9toHg19)
length(unlist(full))/length(slow)
## [1] 0.549
## better late than never
So: turning nonstandard data into standard data with "standard" (grr) UCSC
assumptions took longer than simply brute-forcing the issue with
read.table().
After importing the files with the "appropriate" (chrom, base-1, base)
indexing, I then went to liftOver() a related GRanges. (Note that the
related GRanges was from a BED file submitted by guys at the Broad, so any
wacky formatting wasn't an issue in this case; here I wanted to control for
any other possible fubars).
foo <- import('an.RRBS.file.mm9.bed.gz', genome='mm9')
mm9toHg19 <- import('mm9ToHg19.over.chain')
bar <- liftOver(foo, mm9toHg19)
length(unlist(bar)) / length(foo)
## [1] 0.622
Needless to say, this was a hell of a lot faster than importing the
corresponding file as a table. However, for the wacky file formats, it was
more time & trouble to decode all the assumptions prior to liftOver() than
it would have been to use granges(read.table('wacky.file.format.csv.gz')).
Ugly and sad, but still true!
So, in conclusion, sometimes it might just be better to import one of
those wacky file formats to a data.frame D or what have you, and use
granges(D).
Or, since I'm one of the people that wrote a df2GR() function, I just use
that.
--t
On Mon, Oct 7, 2013 at 9:23 AM, Steve Lianoglou <lianoglou.st...@gene.com>wrote:
Hi,
+1 from me, too ... I've also had a similar conversion function
(data.[frame|table] <--> GRanges) in my toolbelt which I found quite
useful over the years.
-steve
On Sun, Oct 6, 2013 at 5:00 PM, Kasper Daniel Hansen
<kasperdanielhan...@gmail.com> wrote:
This is a convenience function, which provably has saved tons of time
for
me and others. I get lots of data from various excel/cvs files lying
around various places, and these files _always_ have a clear path to a
GRanges. Perhaps you never have to deal with this kind of data, but we
are
a few experienced users who find it extremely handy and would like it
to be
in a more centralized place.
On Sun, Oct 6, 2013 at 4:26 PM, Michael Lawrence
<lawrence.mich...@gene.com>wrote:
I'm still unconvinced that there is an obvious, general path from
data.frame -> GRanges. It's usually easy enough to just call GRanges(),
often of the pattern with(df, GRanges(...)). Moreover, it's unusual
for me
to encounter genomic data in data.frames.
On Sun, Oct 6, 2013 at 8:37 AM, Kasper Daniel Hansen <
kasperdanielhan...@gmail.com> wrote:
Also, it goes without saying that I am happy to provide a patch for
GenomicRanges, and check that it passes R CMD check, to minimize the
work
of the maintainer.
Kasper
On Sun, Oct 6, 2013 at 9:28 AM, Kasper Daniel Hansen <
kasperdanielhan...@gmail.com> wrote:
bsseq::data.frame2GRanges does the obvious step of converting a
data.frame
to GRanges. It has a couple of bells and whistles where strand can
be
ignored and additional columns (apart from genomic location) may be
ignore
in the output object.
I (and now quite a few other people) use this function almost every
day.
I have seen other implementations in other packages, suggesting
this is
not just something I (we) use.
I suggests adding this function to GenomicRanges. I am happy to
support
it going forward.
Using this function we could also add an as(x, "GRanges") method for
x=data.frame, but I still suggest keeping the basic function for the
extended functionality it provides.
Best,
Kasper
[[alternative HTML version deleted]]
_______________________________________________
Bioc-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/bioc-devel
[[alternative HTML version deleted]]
_______________________________________________
Bioc-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/bioc-devel
--
Steve Lianoglou
Computational Biologist
Bioinformatics and Computational Biology
Genentech
_______________________________________________
Bioc-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/bioc-devel
--
*He that would live in peace and at ease, *
*Must not speak all he knows, nor judge all he sees.*
*
*
Benjamin Franklin, Poor Richard's
Almanack<http://archive.org/details/poorrichardsalma00franrich>