我正在尝试使用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")
如果无法做到这一点,我们也非常感谢有关替代方法的建议。
由于
玛
答案 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
向量可以命名。