采用这个简单的向量x
和两个分组变量g1
和g2
x <- 1:10
g1 <- rep(1:2, each=5)
g2 <- rep(1:3, c(2,3,5))
这些变量的交互作用
中有许多组未在此当前数据中表示。
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
我想在我向错误跟踪器提出以下建议之前,我是否忽略了一些简单的事情,例如为什么 ave
不应该添加 drop=TRUE
?
所以问题是,是否存在 ave
需要了解未表示的交互的情况?
最佳答案
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
关于r - ave 和未表示的交互结果 (drop=FALSE) - 导致错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36348329/