This is a test version of Biostars. For the public version, visit https://www.biostars.org.
R extract the sequences from DNAStringset

Hi,

I have a dataframe tab5 of 6500 lines that contains a column 'ALT' which is a list of DNAStringSet instances of length 1

head(tab5$ALT)

[[1]]
 A DNAStringSet instance of length 1
 width seq
[1]     1 C

[[2]]
 A DNAStringSet instance of length 1
 width seq
 [1]     1 T

If I do:

head(tab5)

dbsnp_id GT_parent1 GT_embryo GT_parent2  chr   start REF ALT   QUAL
1 rs7521546        1/1       0/1        0/0 chr1 3518944   T   C 7828.9

The ALT column just shows the nucleotide, like it should.

However when trying to write this as a table

write.table(tab5, file = "test.txt", sep = "\t", row.names = FALSE)

I get the following in my 'ALT' column

new("DNAStringSet", pool = new("SharedRaw_Pool", xp_list = list(<pointer: 0x0>), .link_to_cached_object_list = list(<environment>)), ranges = new("GroupedIRanges", group = 1, start = 606, width = 1, NAMES = NULL, elementType = "ANY", elementMetadata = NULL, metadata = list()), elementType = "DNAString", elementMetadata = NULL, metadata = list())

How is this possible? I've already tried to convert the 'ALT' column to a character, but this doesn't change a thing.

r

I've already tried to convert the 'ALT' column to a character,

How did you do that? Did you try tab5$ALT <- as.character(tab5$ALT)?

yes, and if I do that, see the same for each element

new("DNAStringSet", pool = new("SharedRaw_Pool", xp_list = list(<pointer: (nil)>), .link_to_cached_object_list = list(<environment>)), ranges = new("GroupedIRanges", group = 1, start = 606, width = 1, NAMES = NULL, elementType = "ANY", elementMetadata = NULL, metadata = list()), elementType = "DNAString", elementMetadata = NULL, metadata = list())

Are you trying to write tab5 or tab7?

tab5, sorry, mistake in the code above, changed it now.

2 answers

this works:

as.character(tab5$ALT[[1]][[1]])

the output is then the nucleotide itself

"C"

You should actually need

tab5$ALT <- sapply(tab5$ALT, function(x) as.character(x[[1]])

If you're assigning like so:

tab5$ALT <- tab5$ALT[[1]][[1]]

you might be actually applying the first element's ALT allele to the entire data frame column by assigning a scalar value to a vector. I'd double check that.


My sample code:

> library('Biostrings')
> dat <- DNAStringSet("C")
> dat
  A DNAStringSet instance of length 1
    width seq
[1]     1 C
R> dat[[1]]
  1-letter "DNAString" instance
seq: C
> as.character(dat[[1]])
[1] "C"
> dat[[1]][[1]]
Error in dat[[1]][[1]] : this S4 class is not subsettable
> as.character(dat[[1]][[1]])
Error in dat[[1]][[1]] : this S4 class is not subsettable

The error in your approach gets clear here:

> dat2 <- DNAStringSet("T")
> ldat <- list(dat,dat2)
> ldat #this is like your head(tab5$ALT)
[[1]]
  A DNAStringSet instance of length 1
    width seq
[1]     1 C

[[2]]
  A DNAStringSet instance of length 1
    width seq
[1]     1 T

> as.character(ldat[[1]][[1]]) #Just the first DNAString (a single value/scalar) 
[1] "C"

> sapply(ldat, function(x) as.character(x[[1]])) # A vector of equal length with each DNAString's nucleotide
[1] "C" "T"

Log in to answer this question.