将通用函数应用于所有数据帧并返回具有相同名称的数据帧

时间:2016-09-15 22:06:10

标签: r list plyr lapply

我正在尝试将函数应用于我在R中的全局环境中的所有类似拼写的数据帧。我想将此函数应用于所有这些数据框,但我无法弄清楚如何在没有指定的情况下执行此操作我希望将数据框返回到全局环境,并使用与之前相同的拼写。

mtcars_test = mtcars
iris_test = iris
#....etc......could be 2 of them or 88 of them...but they will all end in "_test"

# figure out what data frames I am working with
list_of_my_dfs = lapply(ls(pattern = "*_test"), get)

#my function just multiples everything by 2
mytest_function = function(df){ df = df*2; return(df)}

helpme_return_these_dfs_to_outside_the_list=plyr::llply(list_of_my_dfs, mytest_function)

这是我需要帮助的地方。我想将我的函数应用于列表中的每个数据框,然后将该列表中的数据框“返回”到我的环境中。因此,mtcars_test和所有其他数据帧将在任何地方乘以2并返回到全局环境。

2 个答案:

答案 0 :(得分:2)

1)环境下标e设置为包含数据框的环境,然后获取其名称并循环显示它们,如下所示:

BOD_test <- BOD  # not all columns of iris are numeric so use BOD instead
mtcars_test <- mtcars

e <- .GlobalEnv
nms <- ls(pattern = "_test$", envir = e)
for(nm in nms) e[[nm]] <- mytest_function(e[[nm]])

1a)分配最后一个语句的替代方法是:

for(nm in nms) assign(nm, mytest_function( get(nm, e) ), e)

2)列表您可能希望将数据框保留在列表中:

L <- sapply(nms, get, envir = e, simplify = FALSE)
L[] <- lapply(L, mytest_function)

2a)sapply 或者如果您不想覆盖L那么:

sapply(L, mytest_function, simplify = FALSE)

答案 1 :(得分:-1)

您可以使用eapply迭代环境,然后assign将对象存储到您的全局环境中。 eapply的函数参数将是一个匿名函数,它首先从全局获取df,将其分配给临时变量,将其传递给您的函数,然后使用assign将其重新置于全局。

我会告诉你代码,但是如果你不能自己编写代码,你真的不应该这样做。