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 - slack.ser.man.ac.uk Photos - 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