2017-01-18 2 views
1

У меня есть data.frame, называемый dat.Пользовательская функция: Объект не найден R

colnames(dat) 
    [1] "variable" "weight" 

Когда я бегу aggregate(weight ~ variable, dat, sum) функция выполняется без ошибок и возвращает значения, я бы ожидать.

Однако, когда я вставлять aggregate() в пользовательской функции следующим образом:

bins <- function(df, var, wt, n) { 
       tmp <- aggregate(wt ~ var, df, sum) 

       #################### 
       other code not shown 
       #################### 

       return(tmp) 
      } 

, а затем запустить out <- bins(df=dat, var=variable, wt=weight, n=5), я получаю следующее сообщение об ошибке:

Error in eval(expr, envir, enclos) : object 'weight' not found 

Я попытался с помощью with() и без успех.

+0

См Http: // StackOverflow. com/questions/34888027/how-to-pass-strings-as-arguments-in-aggregate-function-for-the-subset-paramete, должны решить проблему. –

ответ

1

не может быть точным, что вы ищете, но я считаю, что гораздо проще работать со строками, где это возможно:

dat <- data.frame(
    variable = sample(letters[1:5], 100, replace = TRUE), 
    variable2 = sample(letters[1:5], 100, replace = TRUE), 
    weight = rnorm(100) 
) 

bins <- function(df, var, wt, n) { 
    tmp <- aggregate(
    as.formula(
     paste(
     wt, 
     paste(var, collapse = '+'), 
     sep = '~')), 
    df, sum) 
    return(tmp) 
} 

bins(df = dat, var = 'variable', wt = 'weight', n = 5) 

bins(df = dat, var = c('variable', 'variable2'), wt = 'weight', n = 5) 

Результаты:

variable weight 
1  a 3.962502 
2  b -0.137942 
3  c -2.435460 
4  d 1.557121 
5  e -0.471481 

    variable variable2  weight 
1   a   a 0.15849141 
2   b   a 2.31792997 
3   c   a -2.67871600 
4   d   a 1.29191822 
5   e   a 0.93714161 
6   a   b 0.58574200 
7   b   b 1.78097554 
8   c   b 0.41522095 
9   d   b 0.32981119 
10  e   b -0.95515100 
11  a   c 1.66244525 
12  b   c -1.92009677 
13  c   c -2.53845106 
14  d   c -1.03501447 
15  e   c -0.53367121 
16  a   d 0.27701130 
17  b   d -0.54682389 
18  c   d 3.28828483 
19  d   d 1.58885843 
20  e   d 0.02646149 
21  a   e 1.27881159 
22  b   e -1.76992683 
23  c   e -0.92179907 
24  d   e -0.61845273 
25  e   e 0.05373811 
+0

Это позаботилось о моей проблеме, хотя я до сих пор не понимаю, почему то, что я изначально делал, не сработало. – drumminactuary

+0

(я могу испортить это): проблема связана с областью действия функции, то есть 'aggregate()' знает, что '' переменная 'weight' является формулой и вызывается внутри глобального env. ищет указанные столбцы в объекте 'dat', но вызываемый внутри функции ищет' wt' и 'var'. Добавьте 'str (wt ~ var)' в качестве первой строки 'bins()', вы увидите, почему произошла ошибка. –

+0

Это может помочь: [Окружающая среда в Advanced R by Hadley Wickham] (http://adv-r.had.co.nz/Environments.html) –

-2

Вы можете заменить простое имя столбца, df[,column] и передать имя столбца в виде строки:

bins <- function(df, var, wt, n) { 
      tmp <- aggregate(df[,wt] ~ df[,var], df, sum) 

      #################### 
      other code not shown 
      #################### 

      return(tmp) 
     } 

Пример использования cars набора данных:

bins <- function(df, var, wt, n) { 

    tmp <- aggregate(df[,wt] ~ df[,var], df, sum) 


    return(tmp) 
} 

bins(cars, 'speed', 'dist') 

This post также может помочь вам.

+1

Я хочу ссылаться на аргументы, представленные функции. Когда я пытаюсь 'tmp <- aggregate (df $ wt ~ df $ var, data = df, FUN = sum)' Я получаю следующую ошибку. Ошибка в model.frame.default (formula = df $ wt ~ df $ var, data = df): недопустимый тип (NULL) для переменной 'df $ wt' – drumminactuary

+0

@drumminactuary OK. Я отредактировал сообщение, чтобы выполнить ваши просьбы. –

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