Tpellirn
Tpellirn

Reputation: 796

How to add one element to a list in R?

I have this example where I split the list into two categories:

list_data1 <- data.frame(date=c("Jan", "Feb", "Mar"), X0=c(3, 9, 5, 1, -2, 8),
                     X1=c(3, 9, 5, 1, -2, 8), mod=c("gg", "gg", "gg"))
 list_data2 <- data.frame(date=c("Jan", "Feb", "Mar"), X0=c(3, 9, 5, 1, -2, 8),
                     X1=c(3, 9, 5, 1, -2, 8), mod=c("m", "m", "m"))
 list_data3 <- data.frame(date=c("Jan", "Feb", "Mar"), X0=c(3, 9, 5, 1, -2, 8),
                     X1=c(3, 9, 5, 1, -2, 8), mod=c("d", "d", "d"))
 list_data4 <- data.frame(date=c("Jan", "Feb", "Mar"), X0=c(1, 2, 5, 1, -2, 8),
                     X1=c(3, 9, 5, 1, -2, 8), mod=c("b", "b", "b"))
 list_data5 <- data.frame(date=c("Jan", "Feb", "Mar"), X0=c(3, 1, 5, 1, -2, 8),
                     X1=c(1, 2, 3, 1, -2, 8), mod=c("f", "f", "f"))
 merged.list <- list(list_data1, list_data2,list_data3,list_data4,list_data5)

  library(dplyr)
  library(purrr)
 rest=bind_rows(merged.list) %>%
group_split(mod %in% c('b', 'f'), .keep = FALSE) %>%
map(~.x %>% group_by(date) %>% summarise(across(X0:X1, mean, na.rm = TRUE)))

I would like to include in rest all data not splited, as rest [[3]]

[[1]] and [[2]] become [[3]]

expected output for the first part

         bind_rows(merged.list) %>%  group_split(mod %in% c('b', 'f'), .keep = FALSE)

    <list_of<
     tbl_df<
      date: character
      X0  : double
      X1  : double
      mod : character
     >
       
         [[1]]
        A tibble: 18 x 4
   date     X0    X1 mod  
   <chr> <dbl> <dbl> <chr>
   1 Jan       3     3 gg   
   2 Feb       9     9 gg   
   3 Mar       5     5 gg   
   4 Jan       1     1 gg   
   5 Feb      -2    -2 gg   
   6 Mar       8     8 gg   
   7 Jan       3     3 m    
   8 Feb       9     9 m    
   9 Mar       5     5 m    
  10 Jan       1     1 m    
  11 Feb      -2    -2 m    
  12 Mar       8     8 m    
  13 Jan       3     3 d    
  14 Feb       9     9 d    
  15 Mar       5     5 d    
  16 Jan       1     1 d    
  17 Feb      -2    -2 d    
  18 Mar       8     8 d    

      [[2]]
     A  tibble: 12 x 4
   
     date     X0    X1 mod  
    <chr> <dbl> <dbl> <chr>
   1 Jan       1     3 b    
   2 Feb       2     9 b    
   3 Mar       5     5 b    
   4 Jan       1     1 b    
   5 Feb      -2    -2 b    
   6 Mar       8     8 b    
   7 Jan       3     1 f    
   8 Feb       1     2 f    
   9 Mar       5     3 f    
   10 Jan       1     1 f    
   11 Feb      -2    -2 f    
   12 Mar       8     8 f  
   
       [[3]]
         A tibble: 30 x 4
        date     X0    X1 mod  
     <chr> <dbl> <dbl> <chr>
     1 Jan       1     3 b    
   2 Feb       2     9 b    
   3 Mar       5     5 b    
   4 Jan       1     1 b    
   5 Feb      -2    -2 b    
   6 Mar       8     8 b    
   7 Jan       3     1 f    
   8 Feb       1     2 f    
   9 Mar       5     3 f    
    10 Jan       1     1 f    
   11 Feb      -2    -2 f

   12 Mar       8     8 f 

    1  Jan       3     3 gg   
   2 Feb       9     9 gg   
   3 Mar       5     5 gg   
   4 Jan       1     1 gg   
   5 Feb      -2    -2 gg   
   6 Mar       8     8 gg   
   7 Jan       3     3 m    
   8 Feb       9     9 m    
   9 Mar       5     5 m    
  10 Jan       1     1 m    
  11 Feb      -2    -2 m    
  12 Mar       8     8 m    
  13 Jan       3     3 d    
  14 Feb       9     9 d    
  15 Mar       5     5 d    
  16 Jan       1     1 d    
  17 Feb      -2    -2 d    
  18 Mar       8     8 d

Upvotes: 1

Views: 114

Answers (2)

akrun
akrun

Reputation: 886938

IN base R, we can do

fulldat <- do.call(rbind, merged.list)
c(split(fulldat, fulldat$mod %in% c('b', 'f')), list(fulldat))

Upvotes: 1

Ronak Shah
Ronak Shah

Reputation: 388807

You can try this :

library(dplyr)

data <- bind_rows(merged.list)
data1 <- data %>% group_split(mod %in% c('b', 'f'), .keep = FALSE)
class(data1) <- 'list'
result <- c(data1, list(data))
result

Upvotes: 0

Related Questions