0

我正在尝试使用 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而不是参数的期望值。

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

列表(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")

如果这是不可能的,我们也非常感谢您对替代方法的建议。

谢谢

马尔

4

1 回答 1

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

添加: by可以命名向量。

于 2013-05-17T03:46:43.717 回答