2013-05-17 77 views
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),例如:

​​

但是,這會導致輸出中的列名稱爲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") 

如果這是不可能的,替代方法的建議也十分讚賞。

由於

+0

你能演示你想要的輸出嗎?你熟悉'plyr'包嗎?根據你想要做什麼,我希望你會在那裏找到答案 – alexwhan

+0

請參閱G. Grothendieck對於我想要的那種輸出的回答,但是我理想地希望能夠以不同的方式指定列的名稱變量名稱 - 因此在他的示例列「g」和「b」中,我將這些名稱定義爲函數中的參數,用於list(FOO = data [[g]])的效果。儘管會檢查'plyr'包。 – Malcoholic

回答

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矢量可以被命名。

+0

這確實部分地解決了它 - 組1和組2列名稱被我排序的實際變量名稱替換。儘管指定了列名是很好的,但在你的例子中,能夠將'g'的輸出列名指定爲'FOO'。 困惑的是,爲什麼以這種方式指定要彙總的變量名稱相同,而在形式爲'list(data [[]])中,它們被命名爲Group.1(,Group。2等) – Malcoholic

+0

已經添加了一個功能,通過''''''矢量組件可以被命名,如果是的話,它使用這些名稱。見第三個例子。 –

+0

完美地工作,謝謝。 – Malcoholic

相關問題