Estoy tratando de escribir una función que evalúe cada término dentro de una matriz contra una condición. Si se cumple la condición para cualquier término, la fila completa se agrega a una segunda matriz.

(contexto: lo estoy haciendo para comparar valores atípicos para todos los atributos. Si alguna fila tiene datos atípicos para cualquier atributo (su puntaje z> 3), entonces toda la fila se agregaría a la matriz de datos atípicos)

Por favor vea mi código abajo. Realmente no entiendo por qué no está funcionando.

outliers <- matrix()
x <- 1
for(r in nrow(all_z_stats)){
  for(c in ncol(all_z_stats)){
    if(all_z_stats[r,c]>3){
      outliers[x,] <- all_z_stats[r,]
      x <- x + 1
    }}
}

Muchas gracias de antemano por cualquier información o aportación.

0
StaticNomad 31 may. 2017 a las 21:17

2 respuestas

La mejor respuesta

Datos de prueba: all_z_stats <- replicate(20, rnorm(20))

Primero, for r in nrow(all_z_stats) conduce a un solo valor r. Mejor bucle r a través de todos los valores del 1 al nrow(all_z_stats): for (r in seq_len(all_z_stats)) = for (r in 1:nrow(all_z_stats)) (lo mismo para c)

Primera mejora:

outliers <- matrix(ncol=ncol(all_z_stats)) # Empty matrix with as many cols as outliers matrix
for(r in seq_len(nrow(all_z_stats))){
    if(any(all_z_stats[r, ] > 3)){ # any is useful, try ?any in R console
        outliers <- rbind(outliers, all_z_stats[r, ]) # add line to outliers
    }
}

Pero puedes hacer esto sin for loop. Primero, busque todos los índices de fila donde está presente una entrada> 3 (usando sapply. Luego, extraiga solo estos índices de all_z_stats:

outliers <- matrix(ncol=ncol(all_z_stats))
all_z_stats[sapply(seq_len(nrow(all_z_stats)), function(r) any(all_z_stats[r, ] > 3)), ]
0
shosaco 31 may. 2017 a las 18:33

Bueno, podría definir valores atípicos como numeric() y usar rbind() para apilar su matriz de esta manera:

outliers <- numeric()

for(r in nrow(all_z_stats)){
  for(c in ncol(all_z_stats)){
    if(all_z_stats[r,c]>3){
      outliers <- rbind(outliers,all_z_stats[r,])
      break
    }
  }
}

Hay mejores formas de lograr este tipo de subconjunto.

0
Nicholas Bucher Ampudia 31 may. 2017 a las 18:45