一次将已定义的函数应用于所有数据帧

时间:2013-08-22 19:59:42

标签: r lapply

我已经定义了一个函数(工作正常)。不过,我在工作空间中有20个数据帧,我希望lapply具有相同的功能(dat1到dat20)。

到目前为止看起来像这样:

dat1 <- func(dat=dat1)
dat2 <- func(dat=dat2)
dat3 <- func(dat=dat3) 
dat4 <- func(dat=dat4)
...
dat20 <- func(dat=dat20)

但是,有没有办法用更短的命令来实现这一优势,即一次性lapply所有数据帧的功能?

我尝试了这个,但它不起作用:

mylist <- paste0("dat", 1:20, sep="")
lapply(mylist, func) 

3 个答案:

答案 0 :(得分:1)

尝试类似:

lapply(mget(ls(pattern="dat")),func)

一些细节:pattern中的ls参数将限制它列出的对象名称(例如,我假设您有其他对象,包括您在全局环境中的函数)。 mget从环境中检索这些对象并将其转换为一个列表,然后您可以lapply执行此功能。

答案 1 :(得分:1)

如果您有变量名称,则可以使用get()从工作区中检索值。相应的赋值函数称为assign()

mylist <- paste0("dat", 1:20)
lapply(mylist, function(name) assign(name, func(dat=get(name))) )

答案 2 :(得分:1)

使用eval而不是lapply可以获得所需的行为。

假设mylist是您要应用fun的data.frame的名称。可能使用

生成mylist
mylist <- ls(pattern="dat")

然后,您可以使用以下代码完全按照您的要求执行操作:

cCmd  <- paste(mylist , "<- func(" ,mylist,")", sep="")
eCmd  <- parse(text=cCmd)
eval(eCmd)