tags:

views:

90

answers:

1

I have a simple two vector dataframe (length=30) that looks something like this:

> mDF
    Param1 w.IL.L
1   AuZgFw    0.5
2   AuZfFw      2
3   AuZgVw   74.3
4   AuZfVw  20.52
5   AuTgIL   80.9
6   AuTfIL  193.3
7   AuCgFL    0.2
8   ...

I'd like to use each of the rows to form 30 single value numeric vectors with the name of the vector taken from mDF$Param1, so that:

> AuZgFw       
[1] 0.5     

etc

I've tried melting and casting, but I suspect there may be an easier way??

Thanks in advance

BT

+4  A: 

The simplest/shortest way is to apply assign over rows:

mDF <- read.table(textConnection("
Param1 w.IL.L
1   AuZgFw    0.5
2   AuZfFw      2
3   AuZgVw   74.3
4   AuZfVw  20.52
5   AuTgIL   80.9
6   AuTfIL  193.3
7   AuCgFL    0.2
"),header=T,stringsAsFactors=F)
invisible(apply(mDF,1,function(x)assign(x[[1]],as.numeric(x[[2]]),envir = .GlobalEnv)))

This involves converting the second column of the data frame to and from a string. invisible is there only to suppress the output of apply.
EDIT: You can also use mapply to avoid coersion to/from strings:

invisible(mapply(function(x,y)assign(x,y,envir=.GlobalEnv),mDF$Param1,mDF$w.IL.L))

Leo Alekseyev
The `mapply` version is a piece of nice code. And if one don't want modify columns type in `data.frame` he could use `as.character` on second `mapply` argument.
Marek