【问题标题】:How can I make a list of all dataframes that are in my global environment?如何列出我的全球环境中的所有数据框?
【发布时间】:2014-10-20 00:26:31
【问题描述】:

我正在尝试在他们身上使用rbind。但是我需要一个已经在我的全球环境中的所有dataframes 的列表。我该怎么做?

我用来在一个目录中导入 20 个 csv 文件的代码。基本上,必须组合成一个数据框。

temp = list.files(pattern = "*.csv")
for (i in 1:length(temp)) assign(temp[i], read.csv(temp[i]))

【问题讨论】:

  • 请提供您的问题的环境和背景。
  • R 全球环境。我已经提到了上下文。我想重新绑定它们。
  • 为什么我的问题被否决了?
  • 在全局环境中放置这么多变量真的很糟糕。当你读入它们时,你应该将所有这些 data.frames 直接放入一个列表中。
  • 类似:List = lapply(temp, read.csv)

标签: r


【解决方案1】:

此函数应返回一个正确的列表,其中包含所有 data.frames 作为元素

dfs <- Filter(function(x) is(x, "data.frame"), mget(ls()))

然后你可以用 rbind 来绑定它们

do.call(rbind, dfs)

当然,周围有一堆相关的 data.frames 是非常愚蠢的,以至于你想rbind 他们。听起来他们可能一开始就应该在列表中。

我建议您远离assign(),这总是表明事情可能发生了冲突。试试

temp <- list.files(pattern="*.csv")
dfs <- lapply(temp, read.csv)

应该立即返回一个列表。

【讨论】:

  • 是的,我觉得我很傻。但我不知道正确的方法。基本上,我有 20 个 csv 文件,我想将它们组合成一个数据框。你能从一开始就帮忙吗?我附上了我用来导入它们的代码
  • @maximusyoda 我已经更新了如何使用lapply读入列表
【解决方案2】:

从您发布的代码中,我建议您开始一个新的 R 会话,并使用以下代码再次读取文件

do.call(rbind, lapply(list.files(pattern = ".csv"), read.csv))

【讨论】:

  • 这看起来很有趣..我正在努力做到这一点。通过一行完成。但我收到此错误:read.table 中的错误(file = file,header = header,sep = sep,quote = quote,:比列名更多的列
  • 那么你必须做一些检查。从lapply(list.files(pattern = ".csv"), read.csv) 开始并浏览该列表以查看问题所在(查看每个dim)。很难诊断出我们看不到的问题。也许提供一点数据。
【解决方案3】:

ls 函数列出了您环境中的所有内容。 get 函数获取具有给定名称的变量。可以使用class函数获取变量的类。

如果你把它们放在一起,你可以这样做:

ls()[sapply(ls(), function(x) class(get(x))) == 'data.frame']

这将返回当前环境中 data.frames 的字符向量。

【讨论】:

  • 这行得通吗?我只得到目录中的文件名列表,而不是环境中的数据框。
  • @maximusyoda 没问题。 ls 列出环境内容, dir 列出文件。不要忘记接受其中一个答案。
  • 不幸的是,不支持具有多个类的元素,例如小标题。很棒的尝试!
  • 您好 MentatOfDune,感谢您,我在 R 中发现了 get() 函数并解决了一个非常有趣的问题!
【解决方案4】:

如果您的全局环境中只有具有相同列数和列名的 data.frames,则以下内容应该有效(非 data.frame 对象无关紧要):

do.call(rbind, eapply(.GlobalEnv,function(x) if(is.data.frame(x)) x))

【讨论】:

    【解决方案5】:

    这是对 MentatOfDune 的回答的轻微改进,它不会捕获具有多个类的 data.frames:

    ls()[grepl('data.frame', sapply(ls(), function(x) class(get(x))))]
    

    【讨论】:

      【解决方案6】:

      改善 MentatOfDune 的回答(顺便说一句,用户名很棒):

      ls()[sapply(ls(), function(x) any(class(get(x)) == 'data.frame'))]
      

      甚至更强大:

      ls()[sapply(ls(), function(x) any(is.data.frame(get(x))))]
      

      这也支持小标题(例如用dplyr 创建),因为它们包含多个类,其中data.frame 是其中之一。

      【讨论】:

        猜你喜欢
        • 2015-08-15
        • 1970-01-01
        • 1970-01-01
        • 2021-08-16
        • 1970-01-01
        • 2020-12-22
        • 2022-01-16
        • 2022-11-07
        • 2021-11-27
        相关资源
        最近更新 更多