Foro de debate

Selección en dataframes

 
Imagen de José Parés Pérez
Selección en dataframes
de José Parés Pérez - miércoles, 25 de enero de 2017, 23:49
 


Necesito ayuda con este problema, por favor.

Dispongo de dos dataframes. El primero de ellos es


head(dhead(b_test3)

user_testId testId userId result partialA partialB partialC partialD partialE partialF partialG controlcontrolDc

46           46         3     19    126       27       26       25       24       24                NULL      NULL              2012-02-09 09:50:48

309         309      3     19    139       32       32       26       25       24                     NULL      NULL        2012-03-01 19:48:10

68           68         3     25    155       36       31       35       28       25                      NULL      NULL        2012-02-10 17:38:52

108         108      3     25    161       37       31       37       33       23                     NULL      NULL        2012-02-12 21:18:18

74           74         3     26    172       33       38       32       40       29                      NULL      NULL        2012-02-10 20:39:23

87           87         3     26    191       38       40       39       40       34                      NULL      NULL        2012-02-11 21:53:50

 Y el seY el segundo

 

head(dhead(db_mindf)

    mindfocusId  user_testId   userId  type         cliks    interval intervalSum intervalSumRegular result ccontrolDc                                                            

23           23              47                19    1                  ……          10654   600034             565631    94   222012-02-09 10:06:17

37           37              78                19    1                  ……          4703      600251             561427    93  2012012-02-10 23:59:22               

40           40              85                19    1                  ……          3778      600222             549593    91   202012-02-11 16:18:52

110         110           225              19    1                ..….           10934   1800031         1553194   86    222012-02-23 22:08:59

121         121           245              19    1                ……          8102      1800028         1569617   87    202012-02-26 00:01:34

124         124           248              19    1                ……          0              0                          12323      0      202012-02-26 21:29:05

150         150            307              19    1              ….. .         6750     1800029          1486017    82   202012-03-01 19:41:25

            160     160     327              19    1               ……          8514     1800018          1699814    94   202012-03-04 10:28:55

   169         169            342            19    1               ……          5544     1800030          1461306    81   202012-03-05 22:05:37

 

Lo que Lo que hay común entre estos dos dataframes es el userId que figura en ambos.

Mi interMi interés es desarrollar un procedimiento de  determinación de la cantidad de veces que apque aparece en db_mindf (el segundo dataframe ) el userId antes de la fecha de la segundsegunda aparición en db_test3 de ese mismo userId .

El caso Como ejemplo, a la vista en este resumen del dataframe: userId 19, su segunda fecha es el 2es el 2012-03-01. El userId 19 aparece 7 veces hasta  esa fecha en el db_mindf.

Espero que se entienda ya que el editor cortó partes laterales y traté de remarcar los bordes perdidos. Lo siento.

José

Imagen de José Parés Pérez
Re: Selección en dataframes
de José Parés Pérez - viernes, 27 de enero de 2017, 12:19
 

  Reitero mi consulta anterior por problemas con el editor:


Lo que hay común entre los dos dataframes que mostré en mensaje anterior es el userId que figura en ambos.

Mi interés es desarrollar un procedimiento de  determinación de la cantidad de veces que aparece en db_mindf (el segundo dataframe ) el userId antes de la fecha de la segunda aparición en db_test3 de ese mismo userId .

El caso a la vista en este resumen del dataframe: userId 19, su segunda fecha es el 2012-03-01. El userId 19 aparece 7 veces hasta antes de esa fecha en el db_mindf.


Espero que esta vez esté más clara mi solicitud de ayuda.

Imagen de José Parés Pérez
Re: Selección en dataframes
de José Parés Pérez - viernes, 27 de enero de 2017, 12:33
 

Reitero mo pregunta completa pues mejoré la inclusión de los dataframes:

Dispongo de dos dataframes. El primero de ellos es

 

head(db_test3)

user_testId testId userId result partialA partialB partialC partialD partialE partialF partialG controlDc

46           46         3     19    126       27       26       25       24       24                NULL      NULL             2012-02-09 09:50:48

309         309      3     19    139       32       32       26       25       24                     NULL      NULL       2012-03-01 19:48:10

68           68         3     25    155       36       31       35       28       25                      NULL      NULL       2012-02-10 17:38:52

108         108      3     25    161       37       31       37       33       23                     NULL      NULL       2012-02-12 21:18:18

74           74         3     26    172       33       38       32       40       29                      NULL      NULL       2012-02-10 20:39:23

87           87         3     26    191       38       40       39       40       34                      NULL      NULL       2012-02-11 21:53:50

 

Y el segundo

 

head(db_mindf)

    mindfocusId user_testId userId type          cliks    interval intervalSum intervalSumRegular result controlDc                                         

23           23              47                19    1  ……          10654   600034             565631    94   2012-02-09 10:06:17

37           37              78                19    1  ……          4703      600251             561427    93  2012-02-10 23:59:22           

40           40              85                19    1  ……          3778      600222             549593    91   2012-02-11 16:18:52

110         110           225              19    1                 ..….           10934   1800031         1553194   86    2012-02-23 22:08:59

121         121           245              19    1                 ……          8102      1800028         1569617   87    2012-02-26 00:01:34

124         124           248              19    1                 ……          0              0                          12323      0      2012-02-26 21:29:05

150            150            307              19    1              ….. .         6750     1800029          1486017    82   2012-03-01 19:41:25

    160         160            327              19    1               ……          8514     1800018          1699814    94   2012-03-04 10:28:55

    169         169            342              19    1               ……          5544     1800030          1461306    81   2012-03-05 22:05:37

 

Lo que hay común entre estos dos dataframes es el userId que figura en ambos.

Mi interés es desarrollar un procedimiento de  determinación de la cantidad de veces que aparece en db_mindf (el segundo dataframe ) el userId antes de la fecha de la segunda aparición en db_test3 de ese mismo userId .

El caso a la vista en este resumen del dataframe: userId 19, su segunda fecha es el 2012-03-01. El userId 19 aparece 7 veces hasta antes de esa fecha en el db_mindf.


Imagen de Manuel Muñoz Márquez
Re: Selección en dataframes
de Manuel Muñoz Márquez - sábado, 28 de enero de 2017, 17:35
 

Buenas:

¿En db_test3 cada id aparece exactamente dos veces o es posible que aparezca más veces?

Si aparecen únicamente dos veces se me ocurre una forma rápida de calcular la fecha a tener en cuenta. La segunda parte, de momento, sólo se me ocurre con un bucle.

Saludos.


Imagen de José Parés Pérez
Re: Selección en dataframes
de José Parés Pérez - domingo, 29 de enero de 2017, 18:39
 

Profesor

Muchas gracias por atender mi consulta.

En db_test3 efectivamente cada id aparece sólo dos veces, después que hice un trabajo de eliminación de la aparición intermedia de los pocos que tenían 3 o más apariciones. (Usé un método basado en table que, a pesar del resultado, sigue siendo un misterio para mi).

Esta colaboración mía no me la van a calificar por la elegancia de los métodos que emplee. Le voy a agradecer cualquier forma de resolver el problema. He probado algunos bucles y la verdad es que demoran un pestañeo para el tamaño de las bases en las que emplean este trabajo que intento hacer.

Espero su próximo comentario. Muchas gracias.

José


Imagen de Manuel Muñoz Márquez
Re: Selección en dataframes
de Manuel Muñoz Márquez - lunes, 30 de enero de 2017, 22:31
 

Buenas:

He creado dos ficheros de datos a partir de los datos que ha puesto para hacer las pruebas:

Si no he entendido mal, el siguiente código hace lo que necesita y sin bucles!!!
Leemos los datos:
db_test3 <- read.csv('db_test3.csv', sep = ' ', header = TRUE, quote = "'")
db_test3$controlDc <- as.POSIXct(db_test3$controlDc)
db_test3
db_mindf <- read.csv('db_mindf.csv', sep = ',', header = TRUE, quote = "'")
db_mindf$ccontrolDc <- as.POSIXct(db_mindf$ccontrolDc)
db_mindf
Comprobamos si cada id está dos veces, el resultado debe ser TRUE
all(table(db_test3$userId) == 2)
Ordenamos por fecha
db_test3 <- db_test3[order(db_test3$controlDc),]
db_test3 <- db_test3[order(db_test3$userId),]
db_test3
Nos quedamos con los elementos pares
db_test4 <- db_test3[seq(2, nrow(db_test3), 2),]
Metemos la fecha del userId en la correspondiente posición del vector fecha. Este paso es el que permite hacer los cálculos sin necesidad de bucles
fecha <- as.POSIXct(numeric(max(db_test3$userId)), origin = "1970-01-01", tz = "UTC")
fecha[db_test4$userId] <- db_test4$controlDc
fecha
Metemos la fecha en db_mindf
db_mindf$fecha <- fecha[db_mindf$userId]
db_mindf
Nos quedamos con la parte de db_mindf con fecha posterior a fecha
db_mindf <- db_mindf[db_mindf$ccontrolDc - db_mindf$fecha > 0, ]
Sólo queda contar

tcuenta <- table(db_mindf$userId)
19
 2

cuenta <- numeric(max(db_test3$userId))

cuenta[as.numeric(names(tcuenta))] <- tcuenta

cuenta

 [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0

Le agradecería comentase aquí si funciona, el número de registros que tiene en cada una de las bases de datos que utiliza, el tiempo que tarda y las características de la máquina donde lo ejecuta.

Un saludo.