[ACTUALIZACIÓN] se le pidió 2 años después de la pregunta ...
Al ejecutar el código en la pregunta, data.table
es ahora más útil y devuelve este (usando 1.8.2):
Error in `[.data.table`(my.dt, , sum(dependent.variable), by = grouping.vars[i]) :
'by' appears to evaluate to column names but isn't c() or key(). Use by=list(...)
if you can. Otherwise, by=eval(grouping.vars[i]) should work. This is for efficiency
so data.table can detect which columns are needed.
y siguiendo el consejo en la segunda frase de error:
my.dt[,sum(dependent.variable), by=eval(grouping.vars[i])]
sex V1
1: M 2650
2: F 2600
vieja respuesta de Jul 2010 (by
ahora puede ser double
y character
, sin embargo):
En rigor las necesidades by
para evaluar a una lista de vectores, cada uno con número entero modo de almacenamiento, sin embargo. Por lo tanto, el vector numérico age
también se puede forzar a un número entero usando as.integer()
. Esto se debe a que data.table utiliza la ordenación de radix (muy rápido) pero el algoritmo de radix es específicamente para enteros solo (consulte la entrada de wikipedia para 'radix sort'). El almacenamiento entero para columnas clave y ad hoc by
es una de las razones por las que data.table es rápido. Un factor es, por supuesto, una búsqueda entera de cadenas únicas.
La idea detrás de by
es que list()
de expresiones es que no está restringido a los nombres de columna. Es habitual escribir expresiones de nombres de columna directamente en el by
. Uno común es agregar por mes; por ejemplo:
DT[,sum(col1), by=list(region,month(datecol))]
o una manera muy rápida de grupo por yearmonth es mediante el uso de una fecha no basado época, como yyyymmddL como se ve en algunos de los ejemplos en el paquete, como este:
DT[,sum(col1), by=list(region,month=datecol%/%100L)]
Observe cómo puede nombrar las columnas dentro de la lista() de esa manera.
Definir y reutilización de expresiones complejas de agrupación:
e = quote(list(region,month(datecol)))
DT[,sum(col1),by=eval(e)]
DT[,sum(col2*col3/col4),by=eval(e)]
O si no desea volver a evaluar las expresiones by
cada vez, puede guardar el resultado de una vez y volver a utilizar el resultado de la eficiencia; Si las expresiones by
mismos tardan mucho tiempo para calcular/asignar o debe volver a usar muchas veces:
byval = DT[,list(region,month(datecol))]
DT[,sum(col1),by=byval]
DT[,sum(col2*col3/col4),by=byval]
favor ver http://datatable.r-forge.r-project.org/ para la información más reciente y el estado. Una nueva presentación estará allí pronto y esperamos lanzar v1.5 a CRAN pronto también. Esto contiene varias correcciones de errores y nuevas características detalladas en el archivo NEWS. La lista de ayuda de tabla de datos tiene alrededor de 30-40 publicaciones al mes que también pueden ser de interés.
Tiene dos "grouping.vars" pero itera desde 1: 5. ¿Me estoy perdiendo algo allí? – Shane
Además, en su ejemplo de trabajo, el sexo es un objeto, mientras que en la versión que falla es un personaje. – Shane
Hola Shane, lo siento, lo arreglé. Debería ser 2 no 5. Eso es lo que no tengo claro, parece que el sexo es un objeto (??). –