0

一覧表示する 1 つ以上の変数とその名前を簡単に指定できるようにするために、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)
  }

ただし、次の 2 つの点で困惑しています。まず、(Group1 ではなく)「group by」列の名前を指定して関数を呼び出せるようにする方法です。たとえば、次の場合です。

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")

これが不可能な場合は、代替方法の提案も大歓迎です。

ありがとう

マル

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 に答える