Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

append list to a list

Tags:

r

I know this is a really noob question, but how do I append a list of dataframes to a dataframe to form a new list, with all the data.frames at the same level in the list?

Some of my attempts:

> df <- data.frame(time=1:5)
> df
  time
1    1
2    2
3    3
4    4
5    5
> innerlist <- list(df,df,df)
> innerlist
[[1]]
  time
1    1
2    2
3    3
4    4
5    5

[[2]]
  time
1    1
2    2
3    3
4    4
5    5

[[3]]
  time
1    1
2    2
3    3
4    4
5    5

> outerlist <- list(df,innerlist)
> outerlist
[[1]]
  time
1    1
2    2
3    3
4    4
5    5

[[2]]
[[2]][[1]]
  time
1    1
2    2
3    3
4    4
5    5

[[2]][[2]]
  time
1    1
2    2
3    3
4    4
5    5

[[2]][[3]]
  time
1    1
2    2
3    3
4    4
5    5


> outerlist2 <- c(df,innerlist)
> outerlist2
$time
[1] 1 2 3 4 5

[[2]]
  time
1    1
2    2
3    3
4    4
5    5

[[3]]
  time
1    1
2    2
3    3
4    4
5    5

[[4]]
  time
1    1
2    2
3    3
4    4
5    5

> outerlist3 <- cbind(df,innerlist)
> outerlist3
  time time time time
1    1    1    1    1
2    2    2    2    2
3    3    3    3    3
4    4    4    4    4
5    5    5    5    5

Pretend that all the dfs are different data-frames.

I want to append df to innnerlist, and get a list with 4 dfs, like:

> outerlistmagic <- magic( df, innerlist )
> outerlistmagic
[[1]]
  time
1    1
2    2
3    3
4    4
5    5

[[2]]
  time
1    1
2    2
3    3
4    4
5    5

[[3]]
  time
1    1
2    2
3    3
4    4
5    5

[[4]]
  time
1    1
2    2
3    3
4    4
5    5
like image 923
Hugh Perkins Avatar asked Oct 25 '12 09:10

Hugh Perkins


2 Answers

If you want df to be a list element, you have to wrap it in list because a data.frame is a list internally. For example:

append(list(df), innerlist)
c(list(df), innerlist)
like image 95
Joshua Ulrich Avatar answered Oct 19 '22 13:10

Joshua Ulrich


As you recognised, c is the correct function to combine lists. While a data.frame is also a list, c will remove the data.frame attribute and drop it to a list containing a vector. You can protect this by wrapping it in another list:

c(list(df),innerlist)
[[1]]
  time
1    1
2    2
3    3
4    4
5    5

[[2]]
  time
1    1
2    2
3    3
4    4
5    5

[[3]]
  time
1    1
2    2
3    3
4    4
5    5

[[4]]
  time
1    1
2    2
3    3
4    4
5    5
like image 41
James Avatar answered Oct 19 '22 14:10

James