使用ls()或objects()获取类数据的对象,frame

h4cxqtbf  于 2023-02-14  发布在  其他
关注(0)|答案(6)|浏览(100)

有没有什么方法可以循环遍历一组对象,并对每个对象应用一个函数?
当我输入ls()objects()时,它返回一个对象名列表,我可以遍历这个列表,确定哪些是data.frame,然后对每个对象运行一个函数。
如何通过函数传递lsobjects中的条目?

lo8azlld

lo8azlld1#

@jverzani给出的关于判断哪些对象是 Dataframe 的答案很好,所以让我们从这个开始,但是我们只想选择那些是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)]

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

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

我使用get()命令实际上按名称获取对象(有关详细信息,请参阅R FAQ)
我已经回答了你上面的问题,但是我怀疑如果你把你的数据框组织成列表项,你的代码会更可读,更容易维护。显然我不能肯定地说这一点,但是我不能想出一个用例,在那里迭代通过所有对象寻找数据框上级把你的数据框保存在列表中,然后调用列表中的每一项。

inb24sb2

inb24sb22#

您可以使用get或mget从对象的名称获取对象,然后使用其中一个apply类型函数进行迭代。

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

将告诉你全局环境中哪些项是 Dataframe 。要在函数中使用,你可以为ls调用指定一个环境。

xvw2m8pv

xvw2m8pv3#

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

fwzugrvs

fwzugrvs4#

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

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

tkqqtvp15#

可以使用函数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"
0yycz8jy

0yycz8jy6#

您可以在mget中将Filteris.data.framels一起使用,以获取命名列表(在本例中为data.frame对象)。
这个list然后可以例如在lapply中使用,以将列表的每个元素应用于函数。

L <- Filter(is.data.frame, mget(ls()))

lapply(L, nrow)

相关问题