[R] Re-sort list of vectors
Adaikalavan Ramasamy
ramasamy at cancer.org.uk
Mon Aug 15 08:00:04 CEST 2005
Here is one possible and ugly hack.
mylist <- list("1"=c(a=1, b=2, c=3), "2"=c(d=4, b=5, e=6))
myvec <- unlist( mylist )
1.a 1.b 1.c 2.d 2.b 2.e
1 2 3 4 5 6
mymat <- sapply( strsplit( names(myvec) , split="\\." ) , c )
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] "1" "1" "1" "2" "2" "2"
[2,] "a" "b" "c" "d" "b" "e"
tmp <- data.frame( "main"=mymat[2,],
"sub"=mymat[ 1,], "value"=myvec )
main sub value
1.a a 1 1
1.b b 1 2
1.c c 1 3
2.d d 2 4
2.b b 2 5
2.e e 2 6
I would be quite happy with at this point to loop through the rows and
insert this element by element into MySQL. This may be inefficient for
large datasets. Otherwise I can create this into a matrix with NAs.
So here is my ugly hack to get the list format that you desire.
tmp2 <- data.frame( "main"=tmp$main,
"elements"=paste('"', tmp$sub, '"=', tmp$value, sep="") )
newlist <- tapply( noquote(as.character(tmp2$elements)), tmp2$main, c )
newlist
$a
[1] "1"=1
$b
[1] "1"=2 "2"=5
$c
[1] "1"=3
$d
[1] "2"=4
$e
[1] "2"=6
I am sure someone will come up with a shorter and neater solution.
Regards, Adai
On Mon, 2005-08-15 at 19:09 +0200, Jan Hummel wrote:
> Thanks a lot! But unfortunately I will not know the dimensions of both lists. And further, the lists may be (partly) disjoint as: x <- list("1"=c(a=1, b=2, c=3), "2"=c(d=4, b=5, e=6)). And last but not least I'm really have to have access to the names of the named list items.
>
> The problem I dealt with is in unlist() merging the names together, as you can see in your example given: "V1", "V2" and "V3". Because off interpreting the names later as identifiers in db queries I'm really interested in getting something like list("a"=c("1"=1), "b"=c("1"=2, "2"=5), "c"=c("1"=3), "d"=c("1"=4), "e"=c("1"=6)) for the above input.
> By giving the result this way I'm able to extract both names from two sets as well as the according value between both items.
>
> One point could be to build a matrix but this matrix would have many NA's. So I prefer Lists of Lists.
>
> Any ideas?
>
> cheers
> Jan
>
> -----Ursprüngliche Nachricht-----
> Von: Liaw, Andy [mailto:andy_liaw at merck.com]
> Gesendet: Montag, 15. August 2005 17:31
> An: Jan Hummel; r-help at stat.math.ethz.ch
> Betreff: RE: [R] Re-sort list of vectors
>
> If all vectors in the list have the same length, why not use a matrix? Then you'd just transpose the matrix if you need to. If you really have to have it as a list, here's one possibility:
>
> > x <- list("1"=c(a=1, b=2, c=3), "2"=c(a=4, b=5, c=6)) x
> $"1"
> a b c
> 1 2 3
>
> $"2"
> a b c
> 4 5 6
> > as.list(as.data.frame(t(matrix(unlist(x), nrow=3))))
> $V1
> [1] 1 4
>
> $V2
> [1] 2 5
>
> $V3
> [1] 3 6
>
> Andy
>
>
> > From: Jan Hummel
> >
> > Hi.
> > Can anyone suggest a simple way to re-sort in R a list of vectors of
> > the following form?
> >
> > input
> > $"1"
> > a b c
> > 1 2 3
> > $"2"
> > a b c
> > 4 5 6
> >
> > Output should be something like:
> > "a"
> > "1" 1
> > "2" 4
> > "b"
> > "1" 2
> > "2" 5
> > "c"
> > "1" 3
> > "2" 6
> >
> > I've been futzing with mapply(), outer(), split(), rbind() and so on
> > but haven't found an elegant solution.
> >
> > Thanks,
> > Jan.
> >
> > P.S. E-mailed CCs of posted replies appreciated.
> >
> > ______________________________________________
> > R-help at stat.math.ethz.ch mailing list
> > https://stat.ethz.ch/mailman/listinfo/r-help
> > PLEASE do read the posting guide!
> > http://www.R-project.org/posting-guide.html
> >
> >
> >
>
> ______________________________________________
> R-help at stat.math.ethz.ch mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html
>
More information about the R-help
mailing list