Neil Shephard
2007-Jul-23 14:50 UTC
[R] problems with character objects and calls to list()
Hi All,
I have a problem trying to get a set of columns recognised as a list
and can't work out how to do it despite trawling through the mailing
list archives, and docs.
A short example...
to.convert <- NULL
n <- 6
for(x in 1:n){
to.convert <- paste(to.convert, paste((2 * x) -1, (2 * x),
sep=":"), sep=",")
}
to.convert <- gsub("^,", "", to.convert)
typeof(to.convert)
[1] "character"
## This is the problem....
list(to.convert)
[[1]]
[1] "1:2,3:4,5:6"
Really I'd like the call to list() to behave as though the text had
been entered directly so that you get....
> list(1:2, 3:4, 5:6)
[[1]]
[1] 1 2
[[2]]
[1] 3 4
[[3]]
[1] 5 6
But how do I get the quote's that surround to.convert removed, given
that it is an object of type character?
Thanks in advance,
Neil
Background
=======
This is a refined example from a larger problem that I'm working on.
Given a data frame of pairs of columns containing genotype data I
would like to convert them to genotype objects using makeGenotypes.
The number of loci (i.e. ncol() / 2) is variable, so I like to be able
to determine how many loci there are and then convert all of them.
Thus an example data set would be...
<-----Start test.dat------>
ID,rs1.1,rs1.2,rs2.1,rs2.2,rs3.1,rs3.2,rs4.1,rs4.2,rs5.1,rs5.2,rs6.1,rs6.2
A0001,1,1,1,2,1,1,2,2,1,2,1,1
A0002,1,2,2,1,1,2,2,1,1,2,1,2
A0003,1,2,2,1,1,1,,,1,2,2,2
A0004,2,2,1,1,2,2,2,2,1,1,2,2
<-----End test.dat----->
I'd then like to read in and convert as follows...
genotype <-read.csv("test.dat")
genotype <- genotype[,-1] ## Removes ID column
n.loci <- ncol(genotype) / 2 ## Calcualtes how many loci
## Build a list of the pairs of columns
to.convert <-NULL
for(x in 1:n.loci){
to.convert <- paste(to.convert, paste((2 * x) -1, (2 * x),
sep=":"), sep=",")
}
to.convert <- gsub("^,", "", to.convert)
## Then convert to genotype object, but get errors...
genotype2 <- makeGenotypes(genotype, convert=list(to.convert))
Error in makeGenotypes(genotype, convert = list(to.convert)) :
When convert is a list, each element must be a 2-vector.
## I've also tried giving the column names but the data disappears
genotype2 <- makeGenotypes(genotype, convert=c(colnames(genotype))
rs1.1 rs1.2 rs2.1 rs2.2 rs3.1 rs3.2 rs4.1 rs4.2 rs5.1 rs5.2 rs6.1 rs6.2
1 <NA> <NA> <NA> <NA> <NA> <NA>
<NA> <NA> <NA> <NA> <NA> <NA>
2 <NA> <NA> <NA> <NA> <NA> <NA>
<NA> <NA> <NA> <NA> <NA> <NA>
3 <NA> <NA> <NA> <NA> <NA> <NA>
<NA> <NA> <NA> <NA> <NA> <NA>
4 <NA> <NA> <NA> <NA> <NA> <NA>
<NA> <NA> <NA> <NA> <NA> <NA>
## What I would like to happen is demonstrated by...
genotype2 <- makeGenotypes(genotype, convert=c(1:2,3:4,5:6,7:8,9:10,11:12))
genotype2
rs1.1/rs1.2 rs2.1/rs2.2 rs3.1/rs3.2 rs4.1/rs4.2 rs5.1/rs5.2 rs6.1/rs6.2
1 1/1 1/2 1/1 2/2 1/2 1/1
2 2/1 1/2 1/2 2/1 1/2 2/1
3 2/1 1/2 1/1 <NA> 1/2 2/2
4 2/2 1/1 2/2 2/2 1/1 2/2
In the above the data has been converted to genotypes.
--
"In mathematics you don't understand things. You just get used to
them." - Johann von Neumann
Email - nshephard at gmail.com / n.shephard at sheffield.ac.uk
Website - http://slack.ser.man.ac.uk/
Photos - http://www.flickr.com/photos/slackline/
> Really I'd like the call to list() to behave as though the text had > been entered directly so that you get.... > > > list(1:2, 3:4, 5:6) > [[1]] > [1] 1 2 > > [[2]] > [1] 3 4 > > [[3]] > [1] 5 6 >> eval(parse(text=paste("list(",to.convert,")",sep="")))[[1]] [1] 1 2 [[2]] [1] 3 4 [[3]] [1] 5 6 [[4]] [1] 7 8 [[5]] [1] 9 10 [[6]] [1] 11 12