我已经定义了一个函数(工作正常)。不过,我在工作空间中有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)
答案 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)