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

max*_*oda 11 r

我正在尝试使用rbind它们.但我需要一份dataframes已列入全球环境的所有内容列表.我该怎么做?

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

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

MrF*_*ick 20

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

dfs <- Filter(function(x) is(x, "data.frame"), mget(ls()))
Run Code Online (Sandbox Code Playgroud)

然后你可以用它们来对抗它们

do.call(rbind, dfs)
Run Code Online (Sandbox Code Playgroud)

当然,拥有一堆数据框架是非常愚蠢的,它们与你想要的相关rbind.听起来他们可能应该首先列入清单.

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

temp <- list.files(pattern="*.csv")
dfs <- lapply(temp, read.csv)
Run Code Online (Sandbox Code Playgroud)

应该立即返回一个列表.


Ric*_*ven 8

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

do.call(rbind, lapply(list.files(pattern = ".csv"), read.csv))
Run Code Online (Sandbox Code Playgroud)


小智 5

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

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

ls()[sapply(ls(), function(x) class(get(x))) == 'data.frame']
Run Code Online (Sandbox Code Playgroud)

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


Jam*_*mes 5

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

do.call(rbind, eapply(.GlobalEnv,function(x) if(is.data.frame(x)) x))
Run Code Online (Sandbox Code Playgroud)


Jon*_*ill 5

这是对MentatOfDune的回答的一点改进,该回答不会捕获具有多个类的data.frames:

ls()[grepl('data.frame', sapply(ls(), function(x) class(get(x))))]
Run Code Online (Sandbox Code Playgroud)


MS *_*nds 5

为了改进 MentatOfDune 的答案(顺便说一下,很棒的用户名):

ls()[sapply(ls(), function(x) any(class(get(x)) == 'data.frame'))]
Run Code Online (Sandbox Code Playgroud)

甚至更强大:

ls()[sapply(ls(), function(x) is.data.frame(get(x)))]
Run Code Online (Sandbox Code Playgroud)

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

使用 R 4 及更高版本获取TRUEs 和FALSEs 的可读版本:

ls() |> sapply(get) |> sapply(is.data.frame)
Run Code Online (Sandbox Code Playgroud)

最后,超级、超级强大,也适用于软件包开发人员:

ls()[sapply(ls(), function(x) is.data.frame(eval(parse(text = x), envir = globalenv())))]
Run Code Online (Sandbox Code Playgroud)