将函数应用于R中的多个数组/矩阵

All*_*ate 1 r function matrix

给出两个数组:

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数组的元素.

是否有我可以用来实现这个的衍生物?

Sim*_*lon 7

而不是mapply我将R内部回收规则用于矢量化函数.如果ab长度相同,则只需执行以下操作:

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)