【问题标题】:Inserting function argument as string within body of function在函数体中插入函数参数作为字符串
【发布时间】:2013-05-17 03:32:20
【问题描述】:

我正在尝试使用 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")

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

谢谢

恶意

【问题讨论】:

  • 你能证明你想要什么输出吗?你熟悉plyr 包吗?根据您想要做的事情,我希望您会在那里找到答案
  • 请参阅 G. Grothendieck 对我想要的输出类型的回答,但理想情况下,我希望能够指定与变量名称不同的列名称 - 所以在他的示例列 'g ' 和 'b' 将是我在函数中定义为参数的名称,具有list(FOO = data[[g]]) 的效果。不过会查看plyr 包。

标签: r function


【解决方案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 向量可能被命名。

【讨论】:

  • 这确实部分解决了它 - Group.1 和 Group.2 列名被我排序的实际变量名替换。不过,最好明确指定列名,因此在您的示例中,能够将“g”的输出列名指定为“FOO”。困惑为什么以这种方式指定要聚合的变量将列命名为相同,而在list(data[[by]]) 的形式中,它们被命名为 Group.1(、Group.2 等)
  • 添加了一个可以命名by 向量组件的功能,如果是,它使用这些名称。见第三个例子。
猜你喜欢
  • 2011-09-04
  • 1970-01-01
  • 1970-01-01
  • 2018-11-28
  • 1970-01-01
  • 2018-03-14
  • 2011-12-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多