2016-09-15 65 views
2

我试图将函数应用于全局环境中的所有类似拼写的数据帧。我想将此函数应用于所有这些数据帧,但我无法弄清楚如何在没有我的情况下指定1。我希望将数据框返回到与以前相同的拼写全球环境。将通用函数应用于所有数据帧并返回具有相同名称的数据帧

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并返回到全局环境。

+1

为什么不把一切都在开始与一个列表? – zx8754

+0

我可以将它保存在一个列表中,但为了我目前的目的,我需要将它们提取出来。我已经知道如何做到这一点,并认为我现在正在这样做。 – runningbirds

+1

“答案”可能是'list2env',但请不要打扰。把它们放在一个列表中。 – joran

回答

-1

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

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

+0

你能举个例子吗?我从来没有听说过这个功能。 – runningbirds

+0

阅读帮助文件!你想要做的事情是先进的,阅读危险,所以你真的需要花时间学习你在做什么。 – adamleerich

+0

@adamleerich; *“我会告诉你代码,但如果你不能自己编码,你真的不应该这样做。”*:这种情绪在问答网站面前苍蝇,尽管同意分配应该是非常小心地使用(如果有的话) – user20650

3

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) 
相关问题