2

我已经定义了一个函数(可以正常工作)。尽管如此,我在工作空间中有 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) 
4

3 回答 3

1

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

假设mylist是您要应用的 data.frame 的名称funmylist可以使用生成

mylist <- ls(pattern="dat")

然后你可以使用下面的代码来做你想做的事:

cCmd  <- paste(mylist , "<- func(" ,mylist,")", sep="")
eCmd  <- parse(text=cCmd)
eval(eCmd)
于 2014-07-07T11:38:30.180 回答
1

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

mylist <- paste0("dat", 1:20)
lapply(mylist, function(name) assign(name, func(dat=get(name))) )
于 2013-08-26T16:27:29.890 回答
1

尝试类似:

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

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

于 2013-08-26T16:26:14.293 回答