2016-09-15 2 views
2

Я пытаюсь применить функцию ко всем одинаково записанным фреймам данных в своей глобальной среде в R. Я хочу применить эту функцию ко всем этим кадрам данных, но я не могу понять, как это сделать без меня, указывая 1 на 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 из глобальной, назначая ее переменной temp, передает ее вашей функции, а затем использует назначение, чтобы вернуть ее в глобальную.

Я бы показал вам код, но если вы не можете это сделать самостоятельно, вы действительно не должны этого делать.

+0

Можете ли вы привести мне пример? Я никогда не слышал эту функцию, упомянутую ранее. – runningbirds

+0

Прочтите файлы справки! То, что вы хотите сделать, продвинуто, читайте опасно, поэтому вам действительно нужно потратить время, чтобы узнать, что вы делаете. – adamleerich

+0

@adamleerich; * «Я бы показал вам код, но если вы не можете его правильно закодировать, вы действительно не должны этого делать». *: Этот тип чувств мухи перед лицом сайта Q & A, хотя согласитесь, что назначение должно быть (если вообще) – 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) 
Смежные вопросы