自定义功能:找不到对象R.

时间:2017-01-18 16:05:57

标签: r

我有一个名为dat的data.frame。

    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()但没有成功。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:-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也可能对您有帮助。