【问题标题】:How can I access all objects of class data.frame inside .GlobalEnv in R如何访问 R 中 .GlobalEnv 内的类 data.frame 的所有对象
【发布时间】:2016-02-13 08:43:43
【问题描述】:

例如,我在 R 中的全局环境 (.GlobalEnv) 中有 8,000 个 data.frames

head(ls(.GlobalEnv))
#[1] "db1" "db2" "db3" "db4" "db5"
tail(ls(.GlobalEnv))
#[1] "db7996" "db7997" "db7998" "db7999" "db8000"

如何访问每个data.frames?

我可以使用.GlobalEnv$"db1" 访问data.frames,但这没用,因为我想对每个人进行线性回归。

【问题讨论】:

    标签: r


    【解决方案1】:

    您可以使用eapplymget 的组合将全球环境中存在的所有data.frames 放在list 中:

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

    然后您可以使用例如lapply(dflist, ...) 对它们中的每一个运行回归。


    @RichardScriven 在 cmets 中提供的一种非常简洁的替代方法是:

    dflist <- Filter(is.data.frame, as.list(.GlobalEnv))
    

    【讨论】:

    • 不错,没想到eapply
    【解决方案2】:

    我能想到的最简单的方法是使用mget 的基本for 循环。

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

    然后您可以对mget 结果应用您喜欢的任何操作。

    注意 - 这假设环境中的唯一变量是 data.frames 用于您的目的,因为它不区分更严格的 for 循环将是:

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

    它只是使用is.data.frame 来检查对象是否确实是data.frame

    【讨论】:

      【解决方案3】:

      也许:

      .Globalenv[ls()]
      

      还可以使用正则表达式模式仅限制以“db”开头的项目

      【讨论】:

      • 我不明白这个。您不能对环境进行子集化。一旦你修正了.GlobalEnv 中的错字,它仍然会报错。
      【解决方案4】:

      我找到了另一个解决方案:

      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])))
      

      谢谢!

      【讨论】:

        猜你喜欢
        • 2021-11-27
        • 2021-10-02
        • 1970-01-01
        • 1970-01-01
        • 2017-06-06
        • 2018-02-26
        • 1970-01-01
        • 2013-04-05
        • 2015-08-30
        相关资源
        最近更新 更多