在R语言中,针对二元运算符的do.call函数

5

在R语言中,是否有内置函数可以在列表或数据框中调用二元运算符/函数?

例如,对于一个包含三个逻辑值的数据框:

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

现在我想做类似于这样的事情:
do.call.bin("|", foo)

因此,它将or运算符应用于所有列,得到:

[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个回答

9

对于这个特定的案例,以下方法也能达到同样的效果:

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

我不确定这是否适用于您心中想要解决的任何实际问题,但感觉与Reduce相关的东西是您想要的,对吗?


1
谢谢,Reduce 正是我所需要的! Reduce("|", foo) 就可以了。 - user1197460

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

根据您的示例,我认为您可能指的是按行操作,此时命令将为 apply(foo,1,any)

要获得等效于向量式的&,您可以使用 all 而不是 any

这两者的好处是,据称它们在确定结果后立即停止,例如在对于 any 的第一个 TRUE 和对于 all 的第一个 FALSE 之后。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接