Foro de debate

Selección en dataframes

 
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.