代码之家  ›  专栏  ›  技术社区  ›  C. Guff

应用于每个单元格的函数“if”

  •  1
  • C. Guff  · 技术社区  · 7 年前

    我正在尝试对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个添加的所有单元格。

    3 回复  |  直到 6 年前
        1
  •  2
  •   tmfmnk    7 年前
    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
    
        2
  •  1
  •   Karolis Koncevičius    7 年前

    你不需要任何申请,可以使用 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
    
        3
  •  1
  •   akrun    7 年前

    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