如何列出我的全局环境中的所有数据框?

时间:2014-08-26 15:40:49

标签: r

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

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

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

6 个答案:

答案 0 :(得分:19)

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

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

然后你可以用

对它们进行攻击
do.call(rbind, dfs)

当然,如果你想要rbind它们之间存在大量数据框架,那将是非常愚蠢的。听起来他们可能应该首先列入清单。

我建议你远离assign(),这总是一个迹象,事情可能会发生冲突。尝试

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

应该立即返回一个列表。

答案 1 :(得分:8)

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

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

答案 2 :(得分:5)

这是MentatOfDune的答案略有改进,它没有捕获带有多个类的data.frames:

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

答案 3 :(得分:4)

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

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

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

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

答案 4 :(得分:4)

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

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

答案 5 :(得分:0)

改善MentatOfDune的答案(顺便提一下好的用户名):

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

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