Use object names within a list in lapply/ldply

前端 未结 4 1385
攒了一身酷
攒了一身酷 2021-01-12 10:35

In attempting to answer a question earlier, I ran into a problem that seemed like it should be simple, but I couldn\'t figure out.

If I have a list of dataframes:

相关标签:
4条回答
  • 2021-01-12 11:01

    Define your list with names and it should give you an .id column with the data.frame name

    df.list <- list(df1=df1, df2=df2, df3=df3)
    df.all <- ldply(df.list, rbind)
    

    Output:

      .id a           x
    1 df1 1  1.84658809
    2 df1 2 -0.01177462
    3 df1 3  0.58579469
    4 df2 1 -0.64748756
    5 df2 2  0.24384614
    6 df2 3  0.59012676
    7 df3 1 -0.63037679
    8 df3 2 -1.17416295
    9 df3 3  1.09349618
    

    Then you can know the data.frame name from the column df.all$.id

    Edit: As per @Gary Weissman's comment if you want to generate the names automatically you can do

    names(df.list) <- paste0('df',seq_along(df.list)
    
    0 讨论(0)
  • 2021-01-12 11:05

    In your definition, df.list does not have names, however, even then the deparse substitute idiom does not appear to work easilty (as lapply calls .Internal(lapply(X, FUN)) -- you would have to look at the source to see if the object name was available and how to get it

    Something like

    names(df.list) <- paste('df', 1:3, sep = '')
    
    foo <- function(n, .list){
             .list[[n]]$id <- n
             .list[[n]]
           } 
    
         a          x id
    1 1  0.8204213  a
    2 2 -0.8881671  a
    3 3  1.2880816  a
    4 1 -2.2766111  b
    5 2  0.3912521  b
    6 3 -1.3963381  b
    7 1 -1.8057246  c
    8 2  0.5862760  c
    9 3  0.5605867  c
    
    0 讨论(0)
  • 2021-01-12 11:09

    if you want to use your function, instead of deparse(substitute(x)) use match.call(), and you want the second argument, making sure to convert it to character

     name <- as.character(match.call()[[2]])
    
    0 讨论(0)
  • 2021-01-12 11:10

    Using base only, one could try something like:

    dd <- lapply(seq_along(df.list), function(x) cbind(df_name = paste0('df',x),df.list[[x]]))
    
    do.call(rbind,dd)
    
    0 讨论(0)
提交回复
热议问题