如何将函数应用于矩阵的每个元素?

问题描述 投票:0回答:3

我正在努力将函数应用于矩阵(下三角杰卡德相似矩阵)的每个元素。

该函数应返回值> .7的矩阵值,并将其他元素重新分配为NA,从而更容易识别高度相似的二元变量。理想情况下,矩阵结构会被保留。

我创建了一个简单的 3x3 样本矩阵,其中填充了用于测试的随机值:

N <- 3 # Observations
N_vec <- 3 # Number of vectors
set.seed(123)
x1 <- runif(N * N_vec)
mat_x1 <- matrix(x1, ncol = N_vec)
mat_x1[upper.tri(mat_x1)] <- NA
diag(mat_x1) <- NA
mat_x1
              [,1]      [,2] [,3]
    [1,]        NA        NA   NA
    [2,] 0.7883051        NA   NA
    [3,] 0.4089769 0.0455565   NA

如何将以下函数应用于返回值 > 0.7 的每个矩阵元素?

y = (function(x) if (x > .7) { return(x) } else { return(NA) })

我希望在应用该功能后看到以下内容:

mat_x2
              [,1] [,2] [,3]
    [1,]        NA   NA   NA
    [2,] 0.7883051   NA   NA
    [3,]        NA   NA   NA
r function matrix mapply
3个回答
4
投票

在这种情况下,你可以这样做:

mat_x1[mat_x1 <= .7] <- NA

#          [,1] [,2] [,3]
#[1,]        NA   NA   NA
#[2,] 0.7883051   NA   NA
#[3,]        NA   NA   NA

如果这只是一个示例,您想应用某种函数变体

y
,您可以执行以下操作。首先确保您的函数是矢量化的并且可以处理多个值,在这种情况下就像将
if
更改为
ifelse
一样简单,然后将函数应用于矩阵。

y = function(x) ifelse(x > .7, x, NA)
y(mat_x1)

3
投票

@RonakShah 的答案更好,但为了完整性(例如,如果您有一个难以矢量化的函数),您可以在矩阵的

both
边距上使用 apply()

f <- function(x) if (!is.na(x) & x > .7) x else NA
apply(mat_x1, MARGIN = c(1,2), FUN = f)
          [,1] [,2] [,3]
[1,]        NA   NA   NA
[2,] 0.7883051   NA   NA
[3,]        NA   NA   NA

1
投票
N <- 3 # Observations
N_vec <- 3 # Number of vectors
set.seed(123)
x1 <- runif(N * N_vec)
mat_x1 <- matrix(x1, ncol = N_vec)
mat_x1[upper.tri(mat_x1)] <- NA
diag(mat_x1) <- NA
mat_x1

new_function <- function( mat_x1 ){
truth_mat <-mat_x1 >.7
truth_mat
newmat <- mat_x1 * truth_mat
newmat[newmat == 0] <- NA
return( newmat )
}

new_function (mat_x1)

返回:

          [,1]      [,2] [,3]
[1,]        NA        NA   NA
[2,] 0.7883051        NA   NA
[3,] 0.4089769 0.0455565   NA
          [,1] [,2] [,3]
[1,]        NA   NA   NA
[2,] 0.7883051   NA   NA
[3,]        NA   NA   NA
© www.soinside.com 2019 - 2024. All rights reserved.