[R] Convert list of lists <--> data frame

Marc Schwartz marc_schwartz at comcast.net
Wed Jul 23 16:49:20 CEST 2008


on 07/23/2008 08:23 AM Michael Friendly wrote:
> For a function that takes an argument as a list of lists of parameters, 
> I'd like to be able to convert that
> to a data.frame and vice versa, but can't quite figure out how.
> 
> pats <- list(structure(list(shape = 0, shape.col = "black", shape.lty = 1,
>    cell.fill = "white", back.fill = "white", label = 1, label.size = 1,
>    ref.col = "gray80", ref.grid = "yes", scale.max = 100), .Names = 
> c("shape",
> "shape.col", "shape.lty", "cell.fill", "back.fill", "label",
> "label.size", "ref.col", "ref.grid", "scale.max")), structure(list(
>    shape = 0, shape.col = "black", shape.lty = 1, cell.fill = "pink",
>    back.fill = "white", label = 1, label.size = 1, ref.col = "gray80",
>    ref.grid = "yes", scale.max = 100), .Names = c("shape", "shape.col",
> "shape.lty", "cell.fill", "back.fill", "label", "label.size",
> "ref.col", "ref.grid", "scale.max")), structure(list(shape = 0,
>    shape.col = "black", shape.lty = 1, cell.fill = "red", back.fill = 
> "white",
>    label = 1, label.size = 1, ref.col = "gray80", ref.grid = "yes",
>    scale.max = 100), .Names = c("shape", "shape.col", "shape.lty",
> "cell.fill", "back.fill", "label", "label.size", "ref.col", "ref.grid",
> "scale.max")))
> 
> So, I want pats.df to have 10 columns,
> c("shape",  "shape.col", "shape.lty", "cell.fill", "back.fill", "label",
> "label.size", "ref.col", "ref.grid", "scale.max"), and 3 rows for this 
> example.
> 
> Given pats.df, I'd want to turn that back to pats.
> 
> thanks for any help,
> -Michael

Michael,

One approach for the first issue:

 > do.call(rbind, lapply(pats, data.frame))
   shape shape.col shape.lty cell.fill back.fill label label.size
1     0     black         1     white     white     1          1
2     0     black         1      pink     white     1          1
3     0     black         1       red     white     1          1
   ref.col ref.grid scale.max
1  gray80      yes       100
2  gray80      yes       100
3  gray80      yes       100


Given that:

 > lapply(seq(along = rownames(pats.df)),
          function(i) as.list(pats.df[i, ]))
[[1]]
[[1]]$shape
[1] 0

[[1]]$shape.col
[1] black
Levels: black

[[1]]$shape.lty
[1] 1

[[1]]$cell.fill
[1] white
Levels: white pink red

[[1]]$back.fill
[1] white
Levels: white

[[1]]$label
[1] 1

[[1]]$label.size
[1] 1

[[1]]$ref.col
[1] gray80
Levels: gray80

[[1]]$ref.grid
[1] yes
Levels: yes

[[1]]$scale.max
[1] 100


[[2]]
[[2]]$shape
[1] 0

[[2]]$shape.col
[1] black
Levels: black

[[2]]$shape.lty
[1] 1

[[2]]$cell.fill
[1] pink
Levels: white pink red

[[2]]$back.fill
[1] white
Levels: white

[[2]]$label
[1] 1

[[2]]$label.size
[1] 1

[[2]]$ref.col
[1] gray80
Levels: gray80

[[2]]$ref.grid
[1] yes
Levels: yes

[[2]]$scale.max
[1] 100


[[3]]
[[3]]$shape
[1] 0

[[3]]$shape.col
[1] black
Levels: black

[[3]]$shape.lty
[1] 1

[[3]]$cell.fill
[1] red
Levels: white pink red

[[3]]$back.fill
[1] white
Levels: white

[[3]]$label
[1] 1

[[3]]$label.size
[1] 1

[[3]]$ref.col
[1] gray80
Levels: gray80

[[3]]$ref.grid
[1] yes
Levels: yes

[[3]]$scale.max
[1] 100



HTH,

Marc Schwartz



More information about the R-help mailing list