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

时间:2013-09-06 15:48:32

标签: r matrix function

给出两个数组:

a = array(1:3)
b = array(3:1)

我想应用一个函数,它顺序地将A的每个元素的值与B的每个元素进行比较,并返回结果。

类似的东西:

compare = function(xa, xb) { if (xa < xb) { 1 } else { 0 } }

...其中xa是a数组中的元素,xb是b数组中的元素。

我可以使用申请的衍生物来实现这个目标吗?

3 个答案:

答案 0 :(得分:7)

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

as.integer( a < b )
#[1] 1 0 0

as.integer就是强迫10,实际上TRUEFALSE将表现为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