R中二进制运算符的类似函数的函数

时间:2012-02-14 17:09:44

标签: r

R中是否有内置函数用于在列表或数据框上调用二元运算符/函数?

例如,采用具有三个逻辑的数据框:

set.seed(10)
foo <- matrix(as.logical(round(runif(24))), ncol = 3)
foo <- as.data.frame(foo)

现在我想做这样的事情:

do.call.bin("|", foo)

以便它将or-operator应用于所有列,产生:

[1]  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE

可能的实施可能是:

do.call.bin <- function (fun.bin, lst) {
    fun.bin <- match.fun(fun.bin)
    if (length(lst) > 2) {
        ret <- fun.bin(lst[[1]], Recall(fun.bin, lst[-1]))
    } else {
        ret <- fun.bin(lst[[1]], lst[[2]])
    }
    return (ret)
}

但是,我怀疑这还没有在R中实现,尽管到目前为止我还没有找到它。是否有更有效的方法来做到这一点?

我不能使用do.call(),因为二元运算符只接受两个参数,我想将二元运算符应用于更多的参数。

2 个答案:

答案 0 :(得分:8)

特别针对这种情况,这会做同样的伎俩:

> apply(foo, 1, function(x) Reduce("|", x))
[1]  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE

我不确定这是否会归结为您想到的任何实际问题,但感觉与Reduce相关的内容是您的想法,不是吗?

答案 1 :(得分:5)

您可以尝试不同的方法。要执行按列操作,您可以查看apply(yourDF, 2, theFunction)。要对整个向量应用|操作,theFunction可以是any,例如apply(foo, 2, any)

但是,考虑到你的例子,我认为你可能指的是行式操作,在这种情况下,命令将是apply(foo, 1, any)

要获得与向量&相同的效果,您可以使用all代替any

这两个方面的好处在于,据报​​道,一旦确定结果就会停止,例如在TRUE的第一个anyFALSE的第一个all之后。