r data.table

Usando.I para devolver números de fila con el paquete data.table



(3)

Lo siento si esto parece extremadamente básico, pero todo lo que he podido encontrar en la documentación de data.table es WHAT .I y .N do, not CÓMO usarlos.

Primero revisemos la documentación. ?data.table y busqué .I . Esto es lo que hay allí:

Avanzado: al agrupar , los símbolos .SD, .BY, .N, .I y .GRP se pueden usar en la expresión j, definida de la siguiente manera.

.I es un vector entero igual a seq_len (nrow (x)). Mientras se agrupa , mantiene para cada elemento del grupo su ubicación de fila en x. Esto es útil para el subconjunto en j; por ejemplo, DT [, .I [which.max (somecol)], by = grp].

Énfasis añadido por mí aquí. La intención original era .I ser utilizado mientras se agrupaba. Tenga en cuenta que, de hecho, hay un ejemplo allí en la documentación de CÓMO usar .I .

Usted no está agrupando.

Dicho eso, lo que probaste fue razonable. Con el tiempo, estos símbolos han llegado a ser utilizados cuando no se agrupan también. Puede haber un caso que .I Debería devolver lo que esperaba. Puedo ver que usar .I en j junto con i y by podría ser útil. Actualmente .I No me parece útil cuando estoy presente, como usted señaló.

El uso de la función which() es bueno pero puede evitar la optimización en i ( which() necesita una entrada lógica larga que debe crearse y pasarse a ella). Usar el argumento which=TRUE es bueno, pero luego simplemente devuelve los números de fila (entonces no podría hacer algo con esos números de fila en j por grupo).

La solicitud de función #1494 presentada para discutir el cambio de .I para que funcione de la manera que esperaba. La documentación contiene las palabras "su ubicación de fila en x", lo que implicaría lo que esperaba ya que x es la tabla de datos completa.

¿Alguien podría explicarme el uso correcto de .I para devolver los números de fila de una tabla de datos?

Tengo datos como este:

require(data.table) DT <- data.table(X=c(5, 15, 20, 25, 30)) DT # X # 1: 5 # 2: 15 # 3: 20 # 4: 25 # 5: 30

Quiero devolver un vector de índices de filas donde una condición en i es TRUE , por ejemplo, qué filas tienen una X mayor que 20.

DT[X > 20] # rows 4 & 5 are greater than 20

Para obtener los índices, intenté:

DT[X > 20, .I] # [1] 1 2

... pero claramente lo estoy haciendo mal, porque eso simplemente devuelve un vector que contiene 1 a la cantidad de filas devueltas. (¿Cuál pensé que era para lo que .N era para?).

Lo siento si esto parece extremadamente básico, pero todo lo que he podido encontrar en la documentación de data.table es WHAT .I y .N do, not CÓMO usarlos.


Alternativamente,

DataTable[ , which(X>10) ]

es probablemente más fácil de entender y más idiomáticamente R.


Si todo lo que quiere son los números de fila en lugar de las filas, entonces use which = TRUE , not .I .

DT[X > 20, which = TRUE] # [1] 4 5

De esta forma obtendrá los beneficios de la optimización de i , por ejemplo, uniones rápidas o el uso de un índice automático. El which = TRUE lo devuelve temprano solo con los números de fila.

Aquí está la entrada manual para el argumento dentro de data.table:

TRUE devuelve los números de fila de x que i . Si NA , devuelve los números de fila de i que no coinciden en x . Por defecto FALSE y las filas en x que coinciden son devueltas.

Explicación:

Observe que hay una relación específica entre .I y el argumento i = .. en DT[i = .., j = .., by = ..] A saber, .I es un vector de números de fila de la tabla subconjuntada.

### Lets create some sample data set.seed(1) LL <- sample(LETTERS[1:5], 20, TRUE) DT <- data.table(X=LL)

mira la diferencia entre subconjunto de toda la tabla y subconjunto solo .I

DT[X == "B", .I] # [1] 1 2 3 4 5 6 DT[ , .I[X == "B"] ] # [1] 1 2 5 11 14 19