在函数体内插入函数参数作为字符串

时间:2013-05-17 03:32:21

标签: r function

我正在尝试使用aggregate()编写一个函数,这将允许我轻松指定一个或多个要列出的变量及其名称。

数据:

   FCST_VAR OBS_SID FCST_INIT_HOUR       ME
     WIND   00000             12    4.00000
     WIND   11111             12   -0.74948
     WIND   22222             12   -0.97792
     WIND   00000             00   -2.15822
     WIND   11111             00    0.94710
     WIND   22222             00   -2.28489

我可以通过相当容易的方式对单个变量进行分组:

aggregate.CNT <- function(input.data, aggregate.by) {

  # Calculate mean ME by aggregating specified variable
  output.data <- aggregate(input.data$ME,
                list(Station_ID = input.data[[OBS_SID]]),          
                mean, na.rm=T)
  }

然而,我对两件事感到难过: 首先,一种能够调用函数指定'group by'列(而不是Group1)的名称的方法,例如在以下情况下:

aggregate.CNT <- function(input.data, aggregate.by, group.name) {

  # Calculate mean ME by aggregating specified variable
  output.data <- aggregate(input.data$ME,
                list(group.name = input.data[[OBS_SID]]),          
                mean, na.rm=T)
}

但是这会导致输出中的列名为group.name,而不是参数的所需值。

其次,在此基础上 - 如果我想选择指定多个变量进行排序 - 使用名称。我尝试使用...但似乎不太可能,因为其他参数显然需要采用以下形式:

  

list(arg1 = input.data [[arg2]],arg3 = input.data [[arg4]])

我认为没有办法将额外的参数放入arg3 = input.data[[arg4]]格式。 所以我想知道是否有办法使用参数将整个字符串插入到函数中,例如:

aggregate.CNT <- function(input.data, aggregate.by.list) {

  # Calculate mean ME by aggregating specified variable
  output.data <- aggregate(input.data$ME,
                list(aggregate.by.list),          
                mean, na.rm=T)

aggregate.CNT(data, "Station_ID = data$OBS_SID, Init_Hour = data$FCST_INIT_HOUR")

如果无法做到这一点,我们也非常感谢有关替代方法的建议。

由于

1 个答案:

答案 0 :(得分:1)

试试这个:

aggregate.CNT <- function(data, by) {
    ag <- aggregate(ME ~., data[c("ME", by)], mean, na.rm = TRUE)
    if (!is.null(names(by))) names(ag) <- c(names(by), "ME")
    ag
}

以下是一个例子:

> DF <- data.frame(ME = 1:5, g = c(1, 1, 2, 2, 2), b = c(1, 1, 1, 2, 2))
> aggregate.CNT(DF, "g")
  g  ME
1 1 1.5
2 2 4.0
> aggregate.CNT(DF, c("g", "b"))
  g b  ME
1 1 1 1.5
2 2 1 3.0
3 2 2 4.5
> aggregate.CNT(DF, c(G = "g", B = "b"))
  G B  ME
1 1 1 1.5
2 2 1 3.0
3 2 2 4.5

ADDED:by向量可以命名。