Home > Back-end >  Extract each data frame name from a list of data frames in lapply function
Extract each data frame name from a list of data frames in lapply function

Time:10-05

I have a list of many data frames and I am trying to perform manipulations to each data frame in the list. I created this lapply function and then the list is then merged together. However when trying to rename certain columns so that they include the respective data frame name:

paste(deparse(substitute(x)),"_start"

the dataframe names are being extracted like this :

x[[i]]_start_1

Here is the full code:

df_list <-lapply(df_list, function(x){
  lookup <- c(start = paste(deparse(substitute(x)),"_start"),
              end = paste(deparse(substitute(x)),"_end"),
              top = paste(deparse(substitute(x)),"_top"),
              left = paste(deparse(substitute(x)),"_left"),
              height = paste(deparse(substitute(x)),"_height"),
              width = paste(deparse(substitute(x)),"_width"),
              type = paste(deparse(substitute(x)),"_type"),
              value = paste(deparse(substitute(x)),"_value"))
  x <- x %>% rename_with(.fn = ~lookup[.x], .cols = intersect(names(.), names(lookup)))
  x <- arrange(x, creativeId)
  x <- x[,-1]
  x <- x %>% distinct()
  x$counter <- with(x, ave(creativeId, with(rle(creativeId), rep(seq_along(values), lengths)), FUN = seq_along))
  x <- x %>% relocate(counter)
  x <- x %>% pivot_wider(names_from =counter, values_from= -names(.)[1:2])
}) 

new_df <- Reduce(function(x,y) merge(x,y,all=TRUE), df_list)

Please let me know if there is a workaround so that the data frame names are printed correctly. Thank you!

CodePudding user response:

We may use Map

df_list2 <- Map(function(x, nm) {
lookup <- c(start = paste0(nm,"_start"),
              end = paste0(nm, "_end"),
              top = paste0(nm,"_top"),
              left = paste0(nm,"_left"),
              height = paste0(nm,"_height"),
              width = paste0(nm,"_width"),
              type = paste0(nm,"_type"),
              value = paste0(nm,"_value"))
  x <- x %>% 
    rename_with(.fn = ~lookup[.x], .cols = intersect(names(.), names(lookup)))
  x <- arrange(x, creativeId)
  x <- x[,-1]
  x <- x %>% distinct()
  x$counter <- with(x, ave(creativeId, 
   with(rle(creativeId), rep(seq_along(values), lengths)), FUN = seq_along))
  x <- x %>% relocate(counter)
  x <- x %>% pivot_wider(names_from =counter, values_from= -names(.)[1:2])
    

}, df_list, names(df_list))
  • Related