无论如何我可以遍历一些对象并为每个对象应用一个函数吗?
当我键入ls()
或objects()
时,它会返回一个对象名称列表。我想遍历此列表,识别data.frame
的那些,然后针对每个对象运行一个函数。
如何通过功能传递ls
或objects
的条目?
道歉,如果这看起来像一个愚蠢的问题......
答案 0 :(得分:17)
@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)
我已经回答了你的上述问题,但我怀疑如果你将数据框组织成列表项,你的代码将更容易阅读和维护。显然我不能肯定地说这个,但我无法想出一个用例,迭代查找数据帧的所有对象比将数据帧保存在列表中然后调用该列表中的每个项目更好。
答案 1 :(得分:11)
您可以使用get或mget从其名称中获取对象,并使用其中一个apply type函数进行迭代。例如,
sapply(mget(ls(), .GlobalEnv), is.data.frame)
将告诉您全局环境中的哪些项目是数据框架。要在函数中使用,您可以为ls调用指定一个环境。
答案 2 :(得分:5)
您可以使用“eapply”循环遍历环境中的对象。
答案 3 :(得分:2)
使用inherits
向混合物投掷另一个解决方案。它基本上(a)从当前环境获取所有对象,(b)检查它们是否从数据框继承。
sapply(sapply(ls(), get), inherits, 'data.frame')
答案 4 :(得分:1)
您可以使用函数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"