0

Suppose that I need to generate several new (sub-)dataframe by slicing an existing dataframe and assign a corresponding new name, for example:

carb1 <- mtcars[mtcars$carb == 1,]
carb2 <- mtcars[mtcars$carb == 2,]
carb3 <- mtcars[mtcars$carb == 3,]
carb4 <- mtcars[mtcars$carb == 4,]
...

I have tried:

library(purrr)

map2(paste0("carb",seq(1:4)),seq(1:4),~assign(.x,mtcars[mtcars$carb == .y,]))

It will generate a list of dataframe as I expected, but it does not assign the corresponding name to each new dataframe. The list of dataframe is totally ok for my use, but I would like to know a way to assign a name to each dataframe within one function (rather than assigning names to the list afterwards). Am I missing some hidden functions of map2 here?

Also, I am happy to know a way using the base R function to achieve what I want. Any ideas? Many thanks!

Chuan
  • 667
  • 8
  • 22
  • 3
    You need `lst1 <- split(mtcars, mtcars$carb)` into a `list` and keep it in a `list` insstead of creating multiple objects – akrun Aug 14 '19 at 15:51
  • 1
    or perhaps `split(mtcars, paste0("carb", mtcars$carb))`. – jay.sf Aug 14 '19 at 15:55
  • 1
    @akrun Wonderful! I realize I have been using `tidyverse` too much and I am very weak in using base R function fluently. Thanks! – Chuan Aug 14 '19 at 15:55
  • `list2env(setNames(split(mtcars, mtcars$carb),paste0("carb",unique(mtcars$carb))))` – Onyambu Aug 14 '19 at 16:28

0 Answers0