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()
,因为二元运算符只接受两个参数,我想将二元运算符应用于更多的参数。
答案 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
的第一个any
和FALSE
的第一个all
之后。