How can I access all objects of class data.frame inside .GlobalEnv in R

后端 未结 4 787
醉话见心
醉话见心 2021-01-25 03:12

I have 8,000 data.frames inside my global environment (.GlobalEnv) in R, for example

head(ls(.GlobalEnv))
#[1] \"db1\" \"db2\" \"db3\"          


        
相关标签:
4条回答
  • 2021-01-25 03:45

    The simplest approach I can think of would be a basic for loop using mget.

    for(df in ls(.GlobalEnv)){
        print(get(df))
    }
    

    You can then apply whatever operation you like on the mget result.

    Note - this assumes the only variables in the environment are data.frames for your purposes as it doesn't discriminate A more restrictive for loop would be:

    for(df in ls(.GlobalEnv)){
        if(is.data.frame(get(df))){
            print(head(get(df)))
        }
    }
    

    which just uses is.data.frame to check if the object is indeed a data.frame.

    0 讨论(0)
  • 2021-01-25 03:46

    You could use a combination of eapply and mget to put all data.frames that are present in the global environment in a list:

    x <- eapply(.GlobalEnv, 'is.data.frame')
    dflist <- mget(names(x[unlist(x)]), .GlobalEnv)
    

    Then you can use for example lapply(dflist, ...) to run a regression on each of them.


    A very concise alternative approach contributed by @RichardScriven in the comments is:

    dflist <- Filter(is.data.frame, as.list(.GlobalEnv))
    
    0 讨论(0)
  • 2021-01-25 03:46

    Perhaps:

    .Globalenv[ls()]
    

    Can also restrict to only items beginning with 'db' using regex patterns

    0 讨论(0)
  • 2021-01-25 04:02

    I have found another solution:

    db1 <- data.frame(x = c(1,2,3),y = c(1.1,1.2,1.3))
    db2 <- data.frame(x = c(1,2,3,4),y = c(2,2.1,2.2,2.3))
    db3 <- data.frame(x = c(1,2,3,4,5),y = c(3,3.1,3.2,3.3,3.4))
    ls()
    #[1] "db1" "db2" "db3"
    nombres <- ls()
    eval(parse(text = nombres[1]))
    #  x   y
    #1 1 1.1
    #2 2 1.2
    #3 3 1.3
    lm(y~x,data = eval(parse(text = nombres[1])))
    

    Thanks!

    0 讨论(0)
提交回复
热议问题