I have a list and would like to create a new list entry, d
, by binding together the existing list entries as shown below:
library(data.table)
## this works fine
example_list <- list("a" = data.frame(x = 1),
"b" = data.frame(x = 2),
"c" = data.frame(x = 3))
example_list[["d"]] <- rbindlist(example_list[c("a", "b", "c")])
Is it possible to create d
at the same time as I create the original list? I would like to do something like this:
## this does not work
example_list <- list("a" = data.frame(x = 1),
"b" = data.frame(x = 2),
"c" = data.frame(x = 3),
"d" = rbindlist(.[c("a", "b", "c")]))
Edit: I need to explicitly reference previous list entries, thus something like this would not work:
## ineligible
example_list <- list("a" = data.frame(x = 1),
"b" = data.frame(x = 2),
"c" = data.frame(x = 3),
"d" = data.frame(x = 1) %>%
rbind(data.frame(x = 2)) %>%
rbind(data.frame(x = 3)))
CodePudding user response:
If we want to use a %>%
, wrap it inside {}
library(dplyr)
library(data.table)
list("a" = data.frame(x = 1),
"b" = data.frame(x = 2),
"c" = data.frame(x = 3)) %>%
{c(., d = list(rbindlist(.[c("a", "b", "c")])))}
In base R
, we can get the data from a list using within.list
within.list(list("a" = data.frame(x = 1),
"b" = data.frame(x = 2),
"c" = data.frame(x = 3)), d <- rbindlist(list(a, b, c)))
-output
$a
x
1 1
$b
x
1 2
$c
x
1 3
$d
x
1: 1
2: 2
3: 3
CodePudding user response:
I don't think base R supports that (nor a package I can think of without similar hacks). I'm inferring that you want to do this without leaving individual frames (e.g., a
, b
) in the main environment, so we can use a local
environment to do what we want.
example_list <- local({
a <- data.frame(x = 1)
b <- data.frame(x = 2)
c <- data.frame(x = 3)
d <- rbindlist(list(a, b, c))
list(a=a, b=b, c=c, d=d)
})