【发布时间】:2018-08-20 06:12:22
【问题描述】:
我有多个列数相同的数据框。
iris1 <- iris
iris2 <- iris
然后,我想提取一些特定的列,并用具有特定列的列覆盖原始数据帧。
func <- function(df) {
temp <- df %>%
select("Species",starts_with("Sepal"))
assign(deparse(substitute(df)),temp,envir=.GlobalEnv)
}
如果我只将函数应用于一个数据帧,效果会很好:
func(iris1)
str(iris1)
'data.frame': 150 obs. of 3 variables:
$ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
$ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
$ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
但是,一旦我尝试将其应用于多个数据帧,它就不起作用了:
func(list(iris1,iris2))
Error: Variable context not set
我试图找到解决方案,但大多数建议建议使用lapply,它以列表格式返回结果。
lapply(list(iris1,iris2),func) -> result
我只想通过函数覆盖数据帧iris1 和iris2,但是如何?目前我正在按数据帧运行函数,但我希望在一次操作中完成。
func(iris1)
func(iris2)
【问题讨论】:
-
当您使用
lapply()时,每个单独的函数调用都具有此签名:FUN(X[[i]], ...)(即deparse(substitute(df)) == "X[[i]]")。所以任何替代方法都会失败。我认为您只需将要分配的名称作为参数传递给func()。 -
谢谢。我尝试了以下脚本,但出现了错误。
assign(paste(df,"",sep=""),temp,envir=.GlobalEnv)(instead of original operation in the function)lapply(list(iris1,iris2)extr)Error:list(iris1,iris2) is not function,string or symbol