Bigchao
Bigchao

Reputation: 1756

How to save data.frames respectively in a list?

Here's my question. It's really appreciated if you can help. I have a list containing several data.frames with different length but the same structure. Now I want to save the data.frames in the list respectively. Note: not combine them using do.call(rbind,...) into one single data.frame. And Also I want to name each of the data.frame in a array.

a=c(1,2,3,4,5,6)

b=c(4,5,6,5,5,5)

c=c(3,4,5,6,7,8)

A=data.frame(a=a,b=b,c=c)

B=data.frame(a=c,b=b,c=a)

C=data.frame(a=b,b=c,c=a)

l <- list(A, B, C)

names.list <- c("NewYear_Data", "Thanks_giving", "Christmas")

Now I want to save the A B C in the list using the name in names.list

To be specific, Here I have a list l, in which have several data.frames. Now I want to save each data.frames in the list l using the name in the names.list.

I tried unlist, and get, and apply...

It would be great if anyone can solve this using plyr, reshape, or data.table methods.

Thanks a lot!

Upvotes: 2

Views: 11573

Answers (4)

JWilliman
JWilliman

Reputation: 3883

If the question is, "How do I save a list of data frames as separate files in a folder?", you may try using saveRDS rather than save (see here).

names(l) <- names.list

lapply(names(l), function(df) 
  saveRDS(l[[df]], file = paste0(df, ".rds")))

list.files(pattern = ".rds")
[1] "Christmas.rds"     "NewYear_Data.rds"  "Thanks_giving.rds"

# To load an individual dataframe later 
df <- readRDS(file = "NewYear_Data.rds")

If you want to use save, the following should work (see here; noting that save preserves variable names, hence the with statement and use of list =).

with(l, 
     lapply(names(l), function(df) 
       save(list = df, file = paste0(df, ".rda"))))

list.files(pattern = ".rda")
[1] "Christmas.rda"     "NewYear_Data.rda"  "Thanks_giving.rda"

Otherwise, you can save the entire list as a single file

save(l, file = "Holidays.Rda")

Upvotes: 2

Simon O&#39;Hanlon
Simon O&#39;Hanlon

Reputation: 59970

Working with a single list with named elements is almost always preferable to working with lots of objects in your workspace. However, two functions that may be of convenience to acheive your aims are setNames() and list2env(). The following line will create named data.frame objects in your global environment using the names in names.list...

list2env( setNames( l , names.list ) , .GlobalEnv )

setNames() is a convenience function that sets the names on an object and returns the object. list2env() assigns each element from a named list into the specified environment so you end up with 3 data.frame objects.

Upvotes: 1

BrodieG
BrodieG

Reputation: 52637

After running your code, we have:

> ls()
[1] "a"          "A"          "b"          "B"          "c"          "C"         
[7] "l"          "names.list"

You can then assign the data.frames to the names in names.list:

> invisible(mapply(function(x, y) assign(x, y, envir=globalenv()), names.list, l))
> ls()
[1] "a"             "A"             "b"             "B"             "c"            
[6] "C"             "Christmas"     "l"             "names.list"    "NewYear_Data" 
[11] "Thanks_giving"
> Christmas
a b c
1 4 3 1
2 5 4 2
3 6 5 3
4 5 6 4
5 5 7 5
6 5 8 6
> NewYear_Data
a b c
1 1 4 3
2 2 5 4
3 3 6 5
4 4 5 6
5 5 5 7
6 6 5 8

Then, if you want to clean up your workspace and remove what you used to create the data, you can run the following (careful, this will remove EVERYTHING in your workspace, except the data frames we just created):

> rm(list=ls()[!(ls() %in% names.list)])
> ls()
[1] "Christmas"     "NewYear_Data"  "Thanks_giving"

Frankly, I would recommend @Andrey's answer with attach, but if you're really looking to get the data frames to be in your workspace and get rid of the stuff you used to create it, this is an option.

Upvotes: 0

Andrey Shabalin
Andrey Shabalin

Reputation: 4614

Here is the solution

l <- list(A, B, C)
nms <- c("NewYear_Data", "Thanks_giving", "Christmas")
names(l) = nms

Now you can use names like this:

l$Christmas

If you want to get rid of the list, do this:

attach(l)
Christmas

To save them in a binary file:

save(list=nms,file='file.Rdata')

Or in a text files:

for( i in 1:length(l))
  write.csv(l[i],paste0(nms[i],'.txt'))

Note to avoid calling your variable names.

Upvotes: 5

Related Questions