Estou com dificuldade para aplicar uma função a cada elemento de uma matriz, uma matriz de similaridade de Jaccard triangular inferior.
A função deve retornar valores da matriz com valores > .7, e reatribuir outros elementos como NA, facilitando a identificação de variáveis binárias altamente similares. Idealmente, a estrutura da matriz é preservada.
Criei uma matriz de amostra simples 3x3 preenchida com valores aleatórios para teste:
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
Como aplico a seguinte função a cada elemento da matriz que retorna valores > 0,7?
y = (function(x) if (x > .7) { return(x) } else { return(NA) })
Gostaria de ver o seguinte depois de aplicar a função:
mat_x2
[,1] [,2] [,3]
[1,] NA NA NA
[2,] 0.7883051 NA NA
[3,] NA NA NA
Neste caso, você pode simplesmente fazer:
Caso isso seja apenas um exemplo e você queira aplicar algum tipo de variação de função,
y
você pode fazer o seguinte. Primeiro, certifique-se de que sua função seja vetorizada e possa manipular múltiplos valores, o que neste caso é tão simples quanto alterarif
paraifelse
e então aplicar a função à matriz.A resposta de @RonakShah é melhor, mas para ser completo (por exemplo, se você tiver uma função difícil de vetorizar), você pode usar
apply()
em ambas as margens da matriz:As outras respostas são ótimas - como uma variante, dados os objetivos desta pergunta específica, se seu objetivo final for identificar combinações de linhas/colunas com um valor maior que algum limite (por exemplo, 0,7), você pode retornar os índices dessas combinações usando
which
e eliminar a necessidade de olhar manualmente para a matriz:Se sua matriz tivesse nomes de linhas e colunas e quisesse ficar chique, você poderia criar uma pequena função auxiliar para deixar tudo bonito. Aqui está um exemplo usando uma nova matriz com frutas como nomes de linhas e animais como nomes de colunas:
Embora haja uma resposta aceita, acho que vale a pena postar
is.na<-
a solução.No RHS você tem um vetor de índice dando quais valores devem se tornar
NA
, neste caso o vetor é a condição lógica que você quer (ou sua negação).Criado em 2024-12-16 com reprex v2.1.1
Isso retorna: