使用 ls() 或 objects() 获取类 data.frame 的对象

Posted

技术标签:

【中文标题】使用 ls() 或 objects() 获取类 data.frame 的对象【英文标题】:Use ls() or objects() to get objects of class data.frame 【发布时间】:2011-04-26 21:11:22 【问题描述】:

我是否可以遍历一组对象并对每个对象应用一个函数?

当我输入ls()objects() 时,它会返回一个对象名称列表。我想遍历这个列表,找出那些是data.frame,然后对每个对象运行一个函数。

如何通过函数传递来自lsobjects 的条目?

【问题讨论】:

我问了一个几乎相同的问题here。那里的答案对我来说效果很好。 【参考方案1】:

@jverzani 给出的关于找出哪些对象是数据帧的答案很好。所以让我们从那个开始。但我们只想选择 data.frames 的项目。所以我们可以这样做:

#test data
df <- data.frame(a=1:10, b=11:20)
df2 <- data.frame(a=2:4, b=4:6)
notDf <- 1

dfs <- ls()[sapply(mget(ls(), .GlobalEnv), is.data.frame)]

数据框的名称现在是 dfs 对象中的字符串,因此您可以将它们传递给其他函数,如下所示:

sapply( dfs, function(x)  str( get( x ) ) )

我使用get() 命令实际按名称获取对象(有关详细信息,请参阅R FAQ)

我已在上面回答了您的问题,但我怀疑如果您将数据框组织成列表项,您的代码将更具可读性和易于维护。显然我不能肯定地说,但我无法提出这样一个用例:遍历所有对象以查找数据帧优于将数据帧保存在列表中,然后调用该列表中的每个项目。

【讨论】:

非常感谢 JD!这正是我想要的! -rb【参考方案2】:

您可以使用 get 或 mget 从其名称中获取对象,并使用其中一个应用类型函数进行迭代。例如,

sapply(mget(ls(), .GlobalEnv), is.data.frame)

将告诉您全局环境中的哪些项目是数据框。要在函数中使用,您可以为 ls 调用指定环境。

【讨论】:

【参考方案3】:

您可以使用“eapply”循环遍历环境中的对象。

【讨论】:

【参考方案4】:

使用inherits 加入另一种解决方案。它基本上 (a) 从当前环境中获取所有对象并 (b) 检查它们是否继承自数据框。

sapply(sapply(ls(), get), inherits, 'data.frame')

【讨论】:

【参考方案5】:

您可以使用函数get() 按名称引用对象

# Create some objects
df <- data.frame(a=1:10)
dl <- list(a=1, b=2, c=3)

# Use `ls()` to return a list of object names
lso <- ls()

# Use `get()` to refer to specific objects
class(get(lso[1]))
[1] "data.frame"

# Using an apply function to evaluate the class
lapply(lso, function(x) class(get(x)))
[[1]]
[1] "data.frame"

[[2]]
[1] "list"

【讨论】:

以上是关于使用 ls() 或 objects() 获取类 data.frame 的对象的主要内容,如果未能解决你的问题,请参考以下文章

R实用命令

列出具有特定存储类的S3存储桶对象

django-改写manage类-objects

Mongoengine Q 类“或”

Linux学习帮助指令及目录文件类指令

Thymeleaf 表达式工具类