我正在努力将函数应用于矩阵(下三角杰卡德相似矩阵)的每个元素。
该函数应返回值> .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
在这种情况下,你可以这样做:
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)
@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
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