1

我试图弄清楚如何在 R 中创建具有某些属性的类。基本上我有一个构造函数,它将数据框作为它的第一个参数,然后强制标识某些列或列范围,按名称或列号。此后,我希望我的方法能够引用构造函数中标识的列,但我希望用户仍然能够通过它们的原始名称引用这些列。

从数据框开始:

DATE <- paste0("201", c(5,5, 6, 6))
HHWEIGHT <- c(100, 200, 100,300)
HHINCOME <-  c(30, 40, 50, 20)

STUFF <- data.frame(DATE, HHWEIGHT, HHINCOME)

这是一个加权平均函数,按日期分组。它使用数据框内部的名称进行分组和创建新列。

mean_dt <- function(X){
  X <- group_by(X, DATE)
  X <- mutate(X, subtot = sum(HHWEIGHT))
  X <- mutate(X, inc_wt = (HHWEIGHT * HHINCOME)/subtot)
  out <- summarize(X, mean(inc_wt))
  out
}

mean_dt(STUFF)

应用于上面的数据框,产生以下结果:

# A tibble: 2 x 2
    DATE `mean(inc_wt)`
  <fctr>          <dbl>
1   2015       18.33333
2   2016       13.75000

我的目标是,在使用构造函数将数据框分配给 MyClass 之后,我可以在类函数内部使用分配的名称,就好像数据框已由构造函数中的(非 NULL - NULL 做其他事情)名称重命名一样。所以在调用这个构造函数之后:

MyClass <- function(X, dt=year, wt=NULL, inc=income){
  class(X) <- c("data.frame", "Myclass")
  # seeking help here
  X
}

STUFF2 <- MyClass(STUFF, dt=DATE, wt=HHWEIGHT, inc=HHINCOME)

这个想法是,下面的方法将产生与上面的 mean_dt 相同的结果。请注意,这只是上面使用构造函数名称的函数。另请注意,在其当前形式下,下面的函数不起作用,因为 R,或者更具体地说,dplyr,无法找到构造函数分配的名称。

MyClass.mean_dt <- function(X){
  # seeking help here
  X <- group_by(X, dt)
  X <- mutate(X, subtot = sum(wt))
  X <- mutate(X, inc_wt = (wt * inc)/subtot)
  out <- summarize(X, mean(inc_wt))
  out
}

mean_dt(STUFF2)

问题是是否可以将某些东西添加到构造函数和/或我的方法函数中,理想情况下是标准化形式的东西,这将使 MyClass.mean_dt 和其他方法像对象 X(此处为 STUFF2)已将其列重命名为构造函数中的赋值。我认为它将添加到我标记为“此处需要帮助”的一个或两个位置。

这个问题在两个限制条件下运行。首先是我希望用户能够使用他/她习惯使用的变量名来操作对象,这些变量名更有可能是列开始时的名称。但我想根据一组通用名称编写自己的方法,而不是用户的特殊名称。

第二个是我不想通过复制对象或任何大型列集来实现内部到方法函数的目标,即能够使用指定的名称。我的对象很大——十到二十个演出(未压缩)并不少见——并且指定的列通常会运行几十个,偶尔也会有数百个。尽管如此,我仍然希望编写普通计算机上的人们可以使用的软件。所以我需要尽量减少复制。

4

1 回答 1

0

以下是mean类对象的方法MyClass

mean.MyClass <- function(X, year, wt, income){
    out <- lapply(split(X, X[[year]]), function(x){
            x[["wted"]] <- x[[wt]] * x[[income]]
            x[[paste("mean", wt, sep = ".")]] <- mean(x[["wted"]])
            x
        })
    out <- do.call(rbind, out)
    row.names(out) <- NULL
    out
}

MyClass <- function(X){
    class(X) <- c("MyClass", class(X))
    X
}

STUFF2 <- MyClass(STUFF)

mean(STUFF2, "DATE", "HHWEIGHT", "HHINCOME")
#  DATE HHWEIGHT HHINCOME wted mean.HHWEIGHT
#1 2015      100       30 3000          5500
#2 2015      200       40 8000          5500
#3 2016      100       50 5000          5500
#4 2016      300       20 6000          5500

请注意,我并不是说您不应该使用管道运算符。year但是将其识别为一列似乎Xbase R仅使用它更棘手。

于 2017-09-24T21:05:38.190 回答