Combine different elements of the same list in dif

2019-09-15 19:14发布

问题:

For example: Three R workspaces A.RData, B.RData and C.RData.

  • In A.RData: A list object list.example <- list(1,2)
  • In B.RData: The same name list object list.example <- list(NULL,NULL,3)
  • In C.RData: The same name list object list.example <- list(NULL,NULL,NULL,4)

What i want to get in a new workspace is an object list.new.example printed as:

[[1]]
[1] 1

[[2]]
[1] 2

[[3]]  
[1] 3  

[[4]]  
[1] 4

I have tried

file.full <- list.files(directory, full.names = TRUE)
list.new.example <- list()
for (i in 1:3) {
   load(file.full[i])
list.new.example <- c(list.new.example, list.example)
}
print(list.new.example)

but it's not what i wanted. NULL is filling. So thanks.

回答1:

This kind of problem can be solved by loading each file in a separate environment. Then it's just a matter of extracting the element named list.example from each of them and combine in a list.

# Create the data
setwd(tempdir())
list.example <- list(1,2)
save(list.example, file="A.RData")
list.example <- list(NULL,NULL,3)
save(list.example, file="B.RData")
list.example <- list(NULL,NULL,NULL,4)
save(list.example, file="C.RData")

# Load
files <- c("A.RData", "B.RData", "C.RData")
env <- lapply(files, function(f){
    e <- new.env()
    load(f, envir=e)
    e
})

# Tidy up
l <- lapply(env, "[[", "list.example")
l <- unlist(l, recursive=FALSE)
list.new.example <- l[!sapply(l, is.null)]

Environments belong to the more advanced features of R that relatively few users are familiar with. They are however quite simple to understand and very useful, just think of them as unordered sets of named objects, that can be manipulated in same ways as an ordinary list. Like this

env[[1]]$list.example
env[[1]][["list.example"]]


标签: r list rdata