2015-08-11 4 views
0

У меня есть два кадры данныхОценка один кодовый блок в двух кадрах данных в R

d1 = data.frame(a=1:4,b=2:5) 
d2 = data.frame(a=0:3,b=3:6) 

и хотел бы оценить тот же блок кода, например

c<-exp(a) 
    d<-b^2 

в течение каждых данных Рамка. На данный момент я должен дублировать блок кода следующим образом:

d1t = within(d1, { 
    c<-exp(a) 
    d<-b^2 
}) 
d2t = within(d2, { 
    c<-exp(a) 
    d<-b^2 
}) 

, что делает мой код подвержен ошибкам, если внести изменения в один из кодовых блоков (они должны быть одинаковыми).

Я не очень хорошо знаком с средами в R, но я думаю, что их можно использовать для решения этой проблемы. Как мне это сделать?

ответ

3

Мы можем поместить объекты dataframe в list. Мы ищем имена объектов с шаблоном ^d\\d+ ie. 'd', за которым следуют номера в глобальной среде. Если имеется несколько объектов (в данном случае 2 объекта, то есть «d1» и «d2»), мы можем получить значения с использованием mget в list.

lst <- mget(ls(pattern='^d\\d+')) 

Теперь мы цикл через list с lapply и создавать новые переменные «C» и «D» с помощью transform.

lst1 <- lapply(lst, transform, c=exp(a), d= b^2) 

Лучше держать 'data.frames' в list. Но если нам нужно обновить исходные наборы данных или создать новые объекты, то есть «d1t» и «d2t» (не рекомендуется), мы сможем изменить имена элементов list с помощью setNames и использовать list2env для создания объектов в глобальной среде.

list2env(setNames(lst1, paste0(names(lst1), 't')), envir=.GlobalEnv) 
d1t 
# a b   c d 
#1 1 2 2.718282 4 
#2 2 3 7.389056 9 
#3 3 4 20.085537 16 
#4 4 5 54.598150 25 

d2t 
# a b   c d 
#1 0 3 1.000000 9 
#2 1 4 2.718282 16 
#3 2 5 7.389056 25 
#4 3 6 20.085537 36 
+0

Будет ли это работать не как 'lst <- ls (pattern = '^ d \\ d +')' –

+0

@ShawnMehan Он дает только имена объектов, например, «d1» и «d2». Чтобы получить значения, нам нужно 'get' или' mget' – akrun

+0

Спасибо, ваш оригинальный комментарий был действительно более полезным. У меня только два кадра данных, построенных отдельно (поэтому объединение их в список не нужно). Но у меня очень длинный блок кода, который включает определения функций. Итак, 'f = function (x) внутри (x, {x <-exp (a); d <-b^2}); d1t <-f (d1) 'работает лучше всего. – js86

4

Это идеальное положение для записи повторяющиеся блоки кода в функцию:

 MyFun <- function(df) { 
     out = within(df, { 
      c<-exp(a) 
      d<-b^2 
     }) 
     return(out) 
     } 

будет делать это до тех пор, как имена переменных одни и те же наборы данных через.

Для запуска кода просто сделать:

d1t <- MyFun(d1) 
    d2t <- MyFun(d2) 

Должно работать.

Смежные вопросы