使用 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
,然后对每个对象运行一个函数。
如何通过函数传递来自ls
或objects
的条目?
【问题讨论】:
我问了一个几乎相同的问题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 的对象的主要内容,如果未能解决你的问题,请参考以下文章