Seqinfo-class {GenomicRanges} | R Documentation |
A Seqinfo object is a table-like object that contains basic information about a set of genomic sequences. The table has 1 row per sequence and 1 column per sequence attribute. Currently the only attributes are the length and circularity flag of the sequence but more attributes might be added in the future.
Typically Seqinfo objects are not used directly but are part of
higher level objects. Those higher level objects will generally
provide a seqinfo
accessor for getting/setting their
Seqinfo component.
Seqinfo(seqnames, seqlengths=NA, isCircular=NA)
:
Creates a Seqinfo object.
In the code snippets below, x
is a Seqinfo object.
length(x)
:
Gets the number of sequences in x
.
seqnames(x)
, seqnames(x) <- value
:
Gets/sets the names of the sequences in x
.
Those names must be non-NA, non-empty and unique.
They are also called the sequence levels or the keys
of the Seqinfo object.
Note that, in general, the end-user should not try to alter the
sequence levels with seqnames(x) <- value
. The recommended way
to do this is with seqlevels(x) <- value
as described below.
names(x)
, names(x) <- value
:
Same as seqnames(x)
and seqnames(x) <- value
.
seqlevels(x)
:
Same as seqnames(x)
.
seqlevels(x) <- value
:
Can be used to rename, drop, add and/or reorder the sequence levels.
value
must be either a named or unnamed character vector.
When value
has names, the names only serve the purpose of
mapping the new sequence levels to the old ones.
Otherwise (i.e. when value
is unnamed) this mapping is
implicitly inferred from the following rules:
(1) If the number of new and old levels are the same, and if the
positional mapping between the new and old levels shows that
some or all of the levels are being renamed, and if the levels
that are being renamed are renamed with levels that didn't exist
before (i.e. are not present in the old levels), then
seqlevels(x) <- value
will just rename the sequence levels.
Note that in that case the result is the same as with
seqnames(x) <- value
but it's still recommended to use
seqlevels(x) <- value
as it is safer.
(2) Otherwise (i.e. if the conditions for (1) are not satisfied)
seqlevels(x) <- value
will consider that the sequence
levels are not being renamed and will just perform
x <- x[value]
.
See below for some examples.
seqlengths(x)
, seqlengths(x) <- value
:
Gets/sets the lengths of the sequences in x
.
isCircular(x)
, isCircular(x) <- value
:
Gets/sets the circularity flags of the sequences in x
.
isCircularWithKnownLength(x)
:
Formally defined as
(isCircular(x) %in% TRUE) & !is.na(seqlengths(x))
.
In the code snippets below, x
is a Seqinfo object.
x[i]
:
A Seqinfo object can be subsetted only by name i.e. i
must be a character vector.
This is a convenient way to drop/add/reorder the rows (aka the
sequence levels) of a Seqinfo object.
See below for some examples.
In the code snippets below, x
is a Seqinfo object.
as.data.frame(x)
:
Turns x
into a data frame.
There are no c
or rbind
method for Seqinfo objects.
Both would be expected to just append the rows in y
to the rows
in x
resulting in an object of length length(x) + length(y)
.
But that would tend to break the constraint that the seqnames of a Seqinfo
object must be unique keys.
So instead, a merge
method is provided.
In the code snippet below, x
and y
are Seqinfo objects.
merge(x, y)
:
Merge x
and y
into a single Seqinfo object where the
keys (aka the seqnames) are union(seqnames(x), seqnames(y))
.
If a row in y
has the same key as a row in x
, and if
the 2 rows contain compatible information (NA values are compatible
with anything), then they are merged into a single row in the result.
If they cannot be merged (because they contain different seqlengths
and/or circularity flags), then an error is raised.
In addition to check for incompatible sequence information,
merge(x, y)
also compares seqnames(x)
with
seqnames(y)
and issues a warning if each of them has names not
in the other. The purpose of these checks is to try to detect situations
where the user might be combining or comparing objects based on
different reference genomes.
H. Pages
x <- Seqinfo(seqnames=c("chr1", "chr2", "chr3", "chrM"), seqlengths=c(100, 200, NA, 15), isCircular=c(NA, FALSE, FALSE, TRUE)) x x[c("chrY", "chr3", "chr1")] # subset by names ## Rename, drop, add and/or reorder the sequence levels: xx <- x seqlevels(xx) <- sub("chr", "ch", seqlevels(xx)) # rename xx seqlevels(xx) <- rev(seqlevels(xx)) # reorder xx seqlevels(xx) <- c("ch1", "ch2", "chY") # drop/add/reorder xx seqlevels(xx) <- c(chY="Y", ch1="1", "22") # rename/reorder/drop/add xx y <- Seqinfo(seqnames=c("chr3", "chr4", "chrM"), seqlengths=c(300, NA, 15)) y merge(x, y) # rows for chr3 and chrM are merged suppressWarnings(merge(x, y)) ## Note that, strictly speaking, merging 2 Seqinfo objects is not ## a commutative operation, i.e., in general 'z1 <- merge(x, y)' ## is not identical to 'z2 <- merge(y, x)'. However 'z1' and 'z2' ## are guaranteed to contain the same information (i.e. the same ## rows, but typically not in the same order): suppressWarnings(merge(y, x)) ## This contradicts what 'x' says about circularity of chr3 and chrM: isCircular(y)[c("chr3", "chrM")] <- c(TRUE, FALSE) y if (interactive()) { merge(x, y) # raises an error }