2012-09-13 20 views
5

El paquete data.table en R proporciona la opción:determinan índices de fila de los miembros del grupo data.table

que: 'TRUE' devuelve los números de fila número entero de 'x' que 'i' coincidencias con .

Sin embargo, no veo manera de obtener, dentro de j, los números de fila número entero de 'x' dentro de los grupos establecidos usando by.

Por ejemplo, dada ...

DT = data.table(x=rep(c("a","b","c"),each=3), y=c(1,3,6)) 

... Me gustaría saber los índices en DT para cada valor de y.

El valor para mí es que estoy usando una tabla de datos en paralelo con otra estructura de datos (ADS) a la que pretendo realizar cálculos agrupados basados ​​en las agrupaciones calculadas de manera eficiente de la tabla de datos.

Por ejemplo, suponiendo ADS es un vector con un valor para cada fila de DT:

ADS<-sample(100,nrow(DT)) 

puedo, como una solución, calcular la media de GroupWise de ADS determinado por DT $ y el grupo si primero agregue una nueva columna de secuencia a data.table.

DT[,seqNum:=seq_len(nrow(DT))] 
DT[,mean(ADS[seqNum]),by=y] 

Lo que da el resultado que quiero a costa de agregar una nueva columna.

Soy consciente de que en este ejemplo que puedo obtener la misma respuesta usando tapply:

tapply(ADS,DT$y,mean) 

Sin embargo, no voy a continuación, obtener la ventaja de rendimiento de data.tables agrupación eficiente (especialmente cuando el '' por columnas están indexados).

¿Quizás hay alguna sintaxis que estoy pasando por alto?

Quizás esta sea una característica fácil de agregar a data.table y debería solicitarla (wink, wink) ???

sintaxis propuesta: ajustarse opcionalmente '.which' a los índices de grupo, lo que permite a escribir:

DT[,mean(ADS[.which]),by=y,which=TRUE] 
+0

Me temo que no sigo. ¿Puede dar un ejemplo de un cálculo que desea realizar entre ADS y DT? –

+0

Azul, sí di un ejemplo de trabajo ... mi última línea de código es computar la media a nivel de grupo en ADS usando índices de DT. En mi _real_ aplicación, la estructura de datos ADS NO es un vector sino un objeto 'GenomicRanges', y mi DT es un metadato sobre los rangos. En cualquier caso, Josh y Matthew, a continuación, están 'en el caso'. ¡Gracias! – malcook

Respuesta

10

Disponible desde data.table 1.8.3 se puede utilizar en el .Ij de un data.table para obtener los índices de fila por grupos ...

DT[ , list(yidx = list(.I)) , by = y ] 
# y yidx 
#1: 1 1,4,7 
#2: 3 2,5,8 
#3: 6 3,6,9 
6

A data.table enchavetado se ordenan de modo que los grupos se almacenan en bloques contiguos. En ese caso, podría utilizar .N para extraer la información de indexación del grupo sabia:.

DT <- data.table(x=rep(c("a","b","c"),each=3), y=c(1,3,6)) 
setkey(DT, y) 

ii <- DT[,.N, by=y] 
ii[, start := cumsum(N) - N[1] + 1][,end := cumsum(N)][, N := NULL] 
# y start end 
# 1: 1  1 3 
# 2: 3  4 6 
# 3: 6  7 9 

(Personalmente, probablemente me acaba de añadir una columna de indexación como el sugerido seqNum parece más sencillo, no creo que afectará demasiado el rendimiento a menos que esté realmente empujando los límites.)

+0

+10! Tal vez OP quiere. Yo? Guiño guiño. –

+0

+11! (¿Es eso un factorial?) Y, sí, OP (ese soy yo) realmente quiere '.I' (o' .which' cuando 'which = TRUE'). ¿Está sobre la mesa para su implementación? – malcook

+0

@ josh-obrien, no me gusta agregar seqNum ya que supone que no hay una columna seqNum ya en uso, y es un cambio destructivo para un objeto que no quiero modificar. Gracias. – malcook

Cuestiones relacionadas