ave和无代表的交互结果(drop = FALSE) - 导致错误

时间:2016-04-01 04:55:23

标签: r interaction

采用这个简单的向量x和两个分组变量,g1g2

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需要了解无代表交互的情况?

2 个答案:

答案 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