Skip to content

[R-es] Calculos matrices diferentes tamaños

5 messages · David Contreras, Jorge I Velez

#
Buen día amigos,

Antes que nada, reitero mis agradecimientos por sus respuestas tan precisas
y oportunas, sigo en mi trabajo de grado y tengo dificultad con un proceso:

Tengo dos matrices A y B, A es de dimensión 5x4 y B es de dimensión 274x3.
Requiero de un proceso en el que tome el primer elemento de la Matriz A
columna 2 y lo compare con todos los elementos de la Matriz B columna 1 y
me diga en un vector de dimensión (1x5) cuantas veces fue el elemento de A
mayor que cada uno de los 274 elementos de B y asi hasta llegar a los 5
elementos de A, es decir el resultado de este proceso sera un vector con 5
elementos y en cada uno me dice cuentas veces fue mayor el elemento [i,j]
mayor que los 274 elementos de B.

Agradezco su colaboración con el tema que como siempre es muy valiosa.


Saludos,

David Contreras.
#
Hola David,

Si entiendo correctamente, lo siguiente deberia hacer lo que describes:

set.seed(123)
A <- matrix(rpois(20, 4), ncol = 4)
B <- matrix(rpois(274*3, 4), ncol = 3)

# el resultado es una matriz de orden 5x3
sapply(1:ncol(B), function(.col) sapply(A[, .col + 1], function(x) sum(x >
B[, .col])))

#     [,1] [,2] [,3]
#[1,]    5  253  243
#[2,]  112  119   69
#[3,]  243  164    3
#[4,]  112  119   69
#[5,]  112   18  260

Este resultado indica que el elemento A[1, 2] es 5 veces mayor que todos
los elementos de B[,1]; A[2, 2] es 112 veces mayor; A[3,2] es 243
veces mayor; A[4,2] es 112 veces mayor y finalmente que A[5,2] es 112
veces mayor que B[, 1].  Similarmente, A[5, 4] es 260 veces mayor que
los elementos de B[,3].

Un por uno seria algo como

R> sapply(A[,2], function(x) sum(x > B[,1]))
[1]   5 112 243 112 112
R> sapply(A[,3], function(x) sum(x > B[,2]))
[1] 253 119 164 119  18
R> sapply(A[,4], function(x) sum(x > B[,3]))
[1] 243  69   3  69 260

Saludos cordiales,
Jorge.-


2015-03-09 16:04 GMT+11:00 David Contreras <davidcontreras00 en gmail.com>:

  
  
#
Buen Día Jorge,

Es algo parecido a lo que necesito, pero no debo tener en cuenta la suma de
la columna sino por ejemplo:

Tengo el elemento [1,2] en la matriz A que contiene el número 5 y por otra
parte tengo la columna [,2] de la Matriz B con valores por ejemplo
(1,2,3,4,5,6,7,8,9,10,11,12). El resultado debería ser un vector que en la
posición uno debe indicar que existen 7 valores mayores a 5 en la columna
[,2] de la matriz B en comparación con el elemento [1,2] e la Matriz A.

Espero ser muy claro ya que a veces se torna un poco complicado la
explicación de lo que se quiere programar.

Saludos,

David Contreras.

El 9 de marzo de 2015, 1:12, Jorge I Velez <jorgeivanvelez en gmail.com>
escribió:

  
  
#
Hola David,

Gracias por la aclaracion.  Confio en que esta vez si se obtiene lo que
buscas:

R> set.seed(123)
R> A <- matrix(rpois(20, 4), ncol = 4)
R> B <- matrix(rpois(274*3, 4), ncol = 3)
R> A
#     [,1] [,2] [,3] [,4]
#[1,]    3    1    8    7
#[2,]    6    4    4    3
#[3,]    3    7    5    1
#[4,]    6    4    4    3
#[5,]    7    4    2    8

R> # el resultado es una matriz de orden 5x3
R> sapply(1:ncol(B), function(.col) sapply(A[, .col + 1], function(x)
sum(B[, .col] > x)))
#        [,1] [,2] [,3]
#[1,]  256    9   13
#[2,]   98  102  157
#[3,]   14   59  244
#[4,]   98  102  157
#[5,]   98  206    6

Ahora hagamos los calculos para los elementos de A:

R> sum(B[,1] > A[1,2])
# [1] 256
R> sum(B[,1] > A[2,2])
# [1] 98
R> sum(B[,1] > A[3,2])
# [1] 14
R> sum(B[,1] > A[4,2])
# [1] 98
R> sum(B[,1] > A[5,2])
# [1] 98
R> sum(B[,2] > A[1,3])
# [1] 9
R> sum(B[,2] > A[2,3])
# [1] 102
R> sum(B[,2] > A[3,3])
# [1] 59
R> sum(B[,2] > A[4,3])
# [1] 102
R> sum(B[,2] > A[5,3])
# [1] 206
R> sum(B[,3] > A[1,4])
# [1] 13
R> sum(B[,3] > A[2,4])
# [1] 157
R> sum(B[,3] > A[3,4])
# [1] 244
R> sum(B[,3] > A[4,4])
# [1] 157
R> sum(B[,3] > A[5,4])
# [1] 6

Saludos,
Jorge.-



2015-03-10 1:40 GMT+11:00 David Contreras <davidcontreras00 en gmail.com>:

  
  
#
Buen día Jorge,

Muchas gracias, ya todo funcionando muy bien.

Saludos,

David C.

El 9 de marzo de 2015, 17:27, Jorge I Velez <jorgeivanvelez en gmail.com>
escribió: