R语言 函数“if“应用于每个单元格

vc9ivgsu  于 2022-12-06  发布在  其他
关注(0)|答案(3)|浏览(196)

我尝试对R中矩阵的每个单元格执行一个函数。我想每3个单元格相加,如果它们〉0。
示例:

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个单元格相加的所有单元格。

yduiuuwa

yduiuuwa1#

对于这种简单的情况,最好使用来自@akrun或@Karolis Koncevičius的解决方案,但您也可以:

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
inb24sb2

inb24sb22#

你不需要任何应用,可以直接使用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
k3fezbri

k3fezbri3#

我们也可以使用

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

相关问题