采用这个简单的向量x
和两个分组变量,g1
和g2
x <- 1:10
g1 <- rep(1:2, each=5)
g2 <- rep(1:3, c(2,3,5))
这些变量的interaction
中有许多组未在当前数据中显示。
table(interaction(g1,g2))
#1.1 2.1 1.2 2.2 1.3 2.3
# 2 0 3 0 0 5
这会导致罕见的错误,基本上可以简化为:
ave(x, list(g1,g2), FUN=function(x) if(length(x)==0) stop() else length(x) )
#Error in FUN(X[[i]], ...) :
现在,我认为没有理由这样做,因为ave
的结果应始终与x
的长度相同,并且丢弃了无代表性的群组交互。
这是ave
的简单修复,例如:
ave2 <- function (x, ..., FUN = mean)
{
if (missing(...))
x[] <- FUN(x)
else {
# the only real edit is the following line
g <- interaction(..., drop=TRUE)
split(x, g) <- lapply(split(x, g), FUN)
}
x
}
...然后给出适当的结果。
ave2(x, list(g1,g2), FUN=function(x) if(length(x)==0) stop() else length(x) )
#[1] 2 2 3 3 3 5 5 5 5 5
我想在我去向bug追踪器提出以下建议之前,我是否忽略了为什么ave
不应该添加drop=TRUE
的简单内容?
所以问题是,是否存在ave
需要了解无代表交互的情况?
答案 0 :(得分:1)
ave
不是问题,而是stop
并非旨在返回长度为0的项目。请尝试以下方法:
ave(x, list(g1,g2), FUN=function(x) if(length(x)==0) {vector("numeric",0)
}else length(x) )
[1] 2 2 3 3 3 5 5 5 5 5
答案 1 :(得分:1)
您也可以将drop
参数传递给ave
:
ave(x,list(g1,g2),drop=TRUE, FUN=function(x) if(length(x)==0) stop() else length(x) )
#[1] 2 2 3 3 3 5 5 5 5 5