1

我正在尝试对R中矩阵的每个单元格执行一个函数。如果它们> 0,我想每3个单元格添加。

例子:

mat <- matrix(data=0:9, nrow=5, ncol=10, byrow=F)
mat3 <- apply(mat, MARGIN = 1, FUN= function(mat) if(mat != 0) {mat+3})

但首先创建了一个长度为 5 的列表,其次是每 3 个添加的所有单元格。

4

3 回答 3

2
apply(mat, 2, function(x) { 
  ifelse(x > 0, x+3, x)})

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,]    0    8    0    8    0    8    0    8    0     8
[2,]    4    9    4    9    4    9    4    9    4     9
[3,]    5   10    5   10    5   10    5   10    5    10
[4,]    6   11    6   11    6   11    6   11    6    11
[5,]    7   12    7   12    7   12    7   12    7    12
于 2018-09-16T13:58:29.623 回答
1

您不需要任何申请,可以ifelse直接使用:

ifelse(mat > 0, mat+3, mat)
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,]    0    8    0    8    0    8    0    8    0     8
[2,]    4    9    4    9    4    9    4    9    4     9
[3,]    5   10    5   10    5   10    5   10    5    10
[4,]    6   11    6   11    6   11    6   11    6    11
[5,]    7   12    7   12    7   12    7   12    7    12

但更快的解决方案是:

mat[mat > 0] <- mat[mat > 0] + 3
mat
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,]    0    8    0    8    0    8    0    8    0     8
[2,]    4    9    4    9    4    9    4    9    4     9
[3,]    5   10    5   10    5   10    5   10    5    10
[4,]    6   11    6   11    6   11    6   11    6    11
[5,]    7   12    7   12    7   12    7   12    7    12
于 2018-09-16T14:20:16.743 回答
1

我们也可以即时执行此操作

mat + (mat > 0) * 3
#      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
#[1,]    0    8    0    8    0    8    0    8    0     8
#[2,]    4    9    4    9    4    9    4    9    4     9
#[3,]    5   10    5   10    5   10    5   10    5    10
#[4,]    6   11    6   11    6   11    6   11    6    11
#[5,]    7   12    7   12    7   12    7   12    7    12
于 2018-09-16T18:44:41.547 回答