Tengo una gran matriz «dt» de visitas al departamento de emergencias más de 2 meses para un conjunto de códigos de diagnóstico. Las columnas son «edad», «sexo», «fecha», «el condado», «zip», «subjectid», «posición», «diag», y «dt»; las dimensiones son 872344 por 9.

Quiero subconjunto de esta matriz y hacer una nueva matriz que contiene sólo las filas para que el «diag» de la columna tiene un número de entre 800 y 849 (todas las columnas).

He estado jugando con la construcción de un bucle y el uso de «que» o «si.a alguien más», pero me estoy quedando en un bloqueo mental. Parece que sería más fácil si solo fue UN diag código que quería retirarse, pero la serie de 50 códigos complica las cosas… apuntando a un bucle? ¿Alguien tiene ideas de cómo subconjunto basado en la búsqueda de ciertos valores?

Aquí está mi principio (que no funciona):

dta = dt
b = 800:849
for (i in 1:length(b)) {

}

OriginalEl autor mEvans | 2012-03-01

4 Comentarios

  1. 5

    Dado su columna nombres, sospecho que su dt es una de datos.marco, no de una matriz; algo que se puede confirmar mediante la ejecución de is.data.frame(dt).

    Si es el caso, una manera fácil para filtrar los datos es utilizar la subset función de la siguiente manera:

    dta <- subset(dt, diag >= 800 & diag <= 849)
    Tienes razón – es un dataframe. Supongo que nunca he entendido la diferencia en R del lenguaje. Gracias!

    OriginalEl autor flodel

  2. 6
    dta = dt[dt[, 8] >= 800 & dt[, 8] <= 849, ]

    ETA: ¿Está usted seguro de que esta es una matriz y no de datos.marco? Si se trata de una de datos.marco, usted puede hacer:

    dta = dt[dt$diag >= 800 & dt$diag <= 849, ]

    OriginalEl autor David Robinson

  3. 0

    Además de las excelentes respuestas de arriba, puedo agregar filter función en dpylr paquete

    filter(dt,diag>=800 & diag <= 849)

    filter() es similar a subset(), excepto que usted puede dar a cualquier número de condiciones de filtrado, que se unen con & (no && que es fácil de hacer accidente!). dpylr paquete también tiene otros datos bonitas de la manipulación de las funciones que puede tener un vistazo.

    OriginalEl autor discipulus

  4. 0

    No quiero convertir el matrix() a un data.frame() como es más lento y supone un mayor uso de la memoria, mientras que matrix() operaciones son generalmente más rápido de todos modos.

    Además de David de la respuesta con el número de columna de la indización:

    dta = dt[dt[,8] >= 800 & dt[,8] <= 849,]

    También existe la forma de usar el nombre de la columna de la indización con una matriz:

    dta = dt[dt[,'metric'] >= 800 & dt[,'metric'] <= 849,]

    Como se muestra por la microbenchmark paquete de mando de una idéntica matriz con 12 columnas y 13,241 filas, ejecutar con R compilado con Intel MKL optimización:

    microbenchmark::microbenchmark(
         test.matrix     = mt[mt[,3] %in% 5:10 & mt[,5] == 1,],
         test.data.frame = df[df[,3] %in% 5:10 & df[,5] == 1,],
         times = 1000
         )
    
    Unit: microseconds
                expr      min       lq     mean  median        uq        max neval
     test.matrix      885.732  938.386 1154.898  943.74  952.4415 138215.318  1000
     test.data.frame 1176.218 1245.826 1363.379 1258.32 1286.4320 3392.556    1000

    Cuando las matrices hacerse muy grandes, esta diferencia se hace tangible. En mi máquina, la matriz de la indexación de las velocidades que superan a los de data.table así.

    OriginalEl autor Adam Erickson

Dejar respuesta

Please enter your comment!
Please enter your name here