r subset data.table

r - subsetting en data.table



(4)

Estoy intentando subcontratar una tabla de datos (del paquete data.table ) en R (no un cuadro de datos). Tengo un año de 4 dígitos como clave. Me gustaría subordenar tomando una serie de años. Por ejemplo, quiero extraer todos los registros que son de 1999, 2000, 2001.

He intentado pasar en mi sintaxis de búsqueda binaria DT[J(year)] lo siguiente:

1999,2000,2001 c(1999,2000,2001) 1999, 2000, 2001

pero ninguno de estos parece funcionar. ¿Alguien sabe cómo hacer un subconjunto donde los años que desea seleccionar no son solo 1, sino varios años?


Como el anterior, pero más data.table esque:

DT[year %in% c(1999, 2000, 2001)]


La pregunta no es clara y no proporciona datos suficientes para trabajar, PERO es útil, por lo que si alguien puede editarla con los datos que proporciono a continuación, uno es bienvenido. El título de la publicación también podría completarse: Matthew Dowle a menudo responde a la pregunta de subconjunto sobre dos vectores, pero con menor frecuencia el de subconjunto de acuerdo con una declaración en un vector. He estado buscando por un tiempo una respuesta, hasta encontrar uno para los vectores de caracteres here .

Consideremos estos datos:

library(data.table) n <- 100 X <- data.table(a=sample(c(10,20,25,30,40),n,replace=TRUE),b=1:n)

La consulta de data.table-style correspondiente a X[X$a %in% c(10,20),] es algo sorprendente:

setkey(X,a) X[.(c(10,20))] X[.(10,20)] # works for characters but not for integers # instead, treats 10 as the filter # and 20 as a new variable # for comparison : X[X$a %in% c(10,20),]

Ahora, ¿cuál es mejor? Si su clave ya está configurada, data.table, obviamente. De lo contrario, podría no hacerlo, como lo demuestran las siguientes mediciones de tiempo (en mi 1,75 Go RAM computer):

n <- 1e7 X <- data.table(a=sample(c(10,20,25,30,40),n,replace=TRUE),b=1:n) system.time(X[X$a %in% c(10,20),]) # utilisateur système écoulé (yes, I''m French) # 1.92 0.06 1.99 system.time(setkey(X,a)) # utilisateur système écoulé # 34.91 0.05 35.23 system.time(X[J(c(10,20))]) # utilisateur système écoulé # 0.15 0.08 0.23

Pero quizás Matthew tenga mejores soluciones ...

[Matthew] Has descubierto que el tipo de clasificación numeric (también conocido como double ) es mucho más lento que el integer . Durante muchos años no permitimos el double de claves por temor a que los usuarios cayeran en esta trampa y reportaran tiempos terribles como este. Permitimos el double de claves con cierta agitación porque la clasificación rápida aún no está implementada para el double . La clasificación rápida en integer y character es bastante buena porque se realizan mediante una ordenación de conteo. ¡Ojalá lleguemos a un ordenamiento numeric rápido un día! (Ahora implementado - ver más abajo).

Tiempos en data.table pre-1.9.0

n <- 1e7 X <- data.table(a=sample(c(10,20,25,30,40),n,replace=TRUE),b=1:n) system.time(setkey(X,a)) # user system elapsed # 13.898 0.138 14.216 X <- data.table(a=sample(as.integer(c(10,20,25,30,40)),n,replace=TRUE),b=1:n) system.time(setkey(X,a)) # user system elapsed # 0.381 0.019 0.408

Recuerde que 2 es de tipo numeric en R por defecto. 2L es un integer . Aunque data.table acepta numeric , todavía prefiere mucho el integer .

La ordenación rápida de radix para números se implementa desde v1.9.0.

Desde v1.9.0 en

n <- 1e7 X <- data.table(a=sample(c(10,20,25,30,40),n,replace=TRUE),b=1:n) system.time(setkey(X,a)) # user system elapsed # 0.832 0.026 0.871


Lo que funciona para data.frame s funciona para data.table s.

subset(DT, year %in% 1999:2001)


Esto funcionará:

sample_DT = data.table(year = rep(1990:2010, length.out = 1000), random_number = rnorm(1000), key = "year") year_subset = sample_DT[J(c(1990, 1995, 1997))]

De manera similar, puede teclear una tabla de datos ya existente con setkey (existing_DT, año) y luego usar la sintaxis J () como se muestra arriba.

Creo que el problema puede ser que no ingresaste los datos primero.