【发布时间】:2014-04-05 07:38:27
【问题描述】:
我通常使用colwise 和tapply 的组合来计算数据框中的分组值。但是,我意外地发现tapply 中的参数FUN 不能与plyr 中的colwise 一起正常工作。示例如下:
数据:
df <- data.frame(a = 1:10, b = rep(1:2, each = 5), c = 2:11)
正常:
library(plyr)
colwise(tapply)(subset(df, select = c(a, c)), df$b, function(x){sum(x[x > 2])})
以上代码正确,可以正常工作。但是如果我加FUN,那就错了:
colwise(tapply)(subset(df, select = c(a, c)), df$b, FUN = function(x){sum(x[x > 2])})
错误是:
Error in FUN(X[[1L]], ...) :
unused arguments (function (X, INDEX, FUN = NULL, ..., simplify = TRUE)
{
FUN <- if (!is.null(FUN)) match.fun(FUN)
if (!is.list(INDEX)) INDEX <- list(INDEX)
nI <- length(INDEX)
if (!nI) stop("'INDEX' is of length zero")
namelist <- vector("list", nI)
names(namelist) <- names(INDEX)
extent <- integer(nI)
nx <- length(X)
one <- 1
group <- rep.int(one, nx)
ngroup <- one
for (i in seq_along(INDEX)) {
index <- as.factor(INDEX[[i]])
if (length(index) != nx) stop("arguments must have same length")
namelist[[i]] <- levels(index)
extent[i] <- nlevels(index)
group <- group + ngroup * (as.integer(index) - one)
ngroup <- ngroup * nlevels(index)
}
if (is.null(FUN)) return(group)
ans <- lapply(X = split(X, group), FUN = FUN, ...)
index <- as.integer(names(ans))
if (simplify && all(unlist(lapply(ans, length)) == 1)) {
ansmat <- array(dim = extent, dimnames = namelist)
谁能解释原因?提前谢谢你。
【问题讨论】:
-
使用
tapply没有错,但是因为无论如何您都在加载plyr,所以更多plyr-esque 替代方案将是:sum_fun <- function(x) sum(x[x > 2]);ddply(.data = df, .variables = .(b), colwise(sum_fun))。这也为您提供了一个明确的“b”列。