给出两个数组:
a = array(1:3)
b = array(3:1)
Run Code Online (Sandbox Code Playgroud)
我想应用一个函数,它顺序地将A的每个元素的值与B的每个元素进行比较,并返回结果.
就像是:
compare = function(xa, xb) { if (xa < xb) { 1 } else { 0 } }
Run Code Online (Sandbox Code Playgroud)
...其中xa是来自数组的元素,而xb将是来自b数组的元素.
是否有我可以用来实现这个的衍生物?
而不是mapply我将R内部回收规则用于矢量化函数.如果a且b长度相同,则只需执行以下操作:
as.integer( a < b )
#[1] 1 0 0
Run Code Online (Sandbox Code Playgroud)
as.integer只是有强迫到1或者0,在现实中TRUE,并FALSE会表现为1,并0在任何后续乘法运算.
set.seed(1); a <- sample(10)
#[1] 3 4 5 7 2 8 9 6 10 1
set.seed(2); b <- sample(10)
#[1] 2 7 5 10 6 8 1 3 4 9
a < b
#[1] FALSE TRUE FALSE TRUE TRUE FALSE FALSE FALSE FALSE TRUE
a * ( a < b )
#[1] 0 4 0 7 2 0 0 0 0 1
a[ a < b ]
#[1] 4 7 2 1
Run Code Online (Sandbox Code Playgroud)
有些人可能会感到惊讶,但这<是一种功能.它调用文件中调用的底层C函数(所有逻辑比较器都可以 - 它们只使用不同的开关用于比较类型)来处理向量回收.你可以像这样写:do_relop/src/main/relop.c<
`<`( a , b )
#[1] FALSE TRUE FALSE TRUE TRUE FALSE FALSE FALSE FALSE TRUE
Run Code Online (Sandbox Code Playgroud)
使用原始<运算符比使用ifelse矢量化函数快100倍(在一对1e6长度向量上):
set.seed(1); a <- sample(10,1e6,repl=T)
set.seed(2); b <- sample(10,1e6,repl=T)
require( microbenchmark)
bm <- microbenchmark( comparealt(a,b) , `<`(a,b) , times = 25L )
print( bm , digits = 3 , unit = "relative" , order = "median" )
#Unit: relative
# expr min lq median uq max neval
# a < b 1 1 1 1 1.0 25
# comparealt(a, b) 131 126 122 105 48.3 25
Run Code Online (Sandbox Code Playgroud)