给出两个数组:
a = array(1:3)
b = array(3:1)
我想应用一个函数,它顺序地将A的每个元素的值与B的每个元素进行比较,并返回结果。
类似的东西:
compare = function(xa, xb) { if (xa < xb) { 1 } else { 0 } }
...其中xa是a数组中的元素,xb是b数组中的元素。
我可以使用申请的衍生物来实现这个目标吗?
答案 0 :(得分:7)
而不是mapply
我将R内部回收规则用于矢量化函数。如果a
和b
的长度相同,则只需执行此操作:
as.integer( a < b )
#[1] 1 0 0
as.integer
就是强迫1
或0
,实际上TRUE
和FALSE
将表现为1
和{{ 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
是一种功能。它在文件<
中调用名为C
的基础do_relop
函数(所有逻辑比较器都这样做 - 它们只使用不同的开关用于比较类型)来处理向量回收。您可以这样写/src/main/relop.c
:
<
使用原始`<`( a , b )
#[1] FALSE TRUE FALSE TRUE TRUE FALSE FALSE FALSE FALSE TRUE
运算符(使用一对1e6长度向量)比使用<
(也是向量化函数)快100多倍:
ifelse
答案 1 :(得分:1)
我最初读过“B的每个元素的A的每个元素的值”,意思是外连接并建议:
compare <- function(x, y){ outer(x, y, FUN="<")+0 }
例如给出
> compare(array(1:6), array(5:3))
[,1] [,2] [,3]
[1,] 1 1 1
[2,] 1 1 1
[3,] 1 1 0
[4,] 1 0 0
[5,] 0 0 0
[6,] 0 0 0
为了比较元素相同维度的矩阵,可以使用
之类的东西comparemat <- function(mat1, mat2){ (mat1 < mat2)+0 }
或
comparealt <- function(mat1, mat2){ ifelse(mat1 < mat2, 1, 0) }
其中一个
comparemat(matrix(1:12,nrow=4), matrix(12:1,nrow=4))
comparealt(matrix(1:12,nrow=4), matrix(12:1,nrow=4))
给
[,1] [,2] [,3]
[1,] 1 1 0
[2,] 1 1 0
[3,] 1 0 0
[4,] 1 0 0
答案 2 :(得分:0)
我偶然发现了“mapply&#39;”,这似乎可以解决问题:
> gg = function(x,y){ if(x < y) { 1 } else { 0 }}
> gg(1,2)
[1] 1
> gg(2,1)
[1] 0
> mapply(gg, 1:4, 4:1)
[1] 1 1 0 0