¿Cuál es la mejor manera de asignar a múltiples columnas usando data.table
? Por ejemplo:
f <- function(x) {c("hi", "hello")}
x <- data.table(id = 1:10)
Me gustaría hacer algo como esto (por supuesto, esta sintaxis es incorrecta):
x[ , (col1, col2) := f(), by = "id"]
Y para extender eso, puedo tener muchas columnas con nombres almacenados en una variable (digamos col_names
) y me gustaría hacer:
x[ , col_names := another_f(), by = "id", with = FALSE]
¿Cuál es la forma correcta de hacer algo como esto?
by
como @Christoph_J es correcto decir. Enlace a su pregunta agregada al FR # 2120 "Elimine la necesidad con = FALSO para LHS de: =", para que no se olvide de volver a visitar.f()
es una función que devuelve múltiples valores, uno para cada una de sus columnas.Respuestas:
Esto ahora funciona en v1.8.3 en R-Forge. ¡Gracias por resaltarlo!
Versión anterior que usa el
with
argumento (desaconsejamos este argumento cuando sea posible):fuente
data.table(objectName=ls())[,c("rows","cols"):=dim(get(objectName)),by=objectName]
(Estoy usandodata.table
1.8.11)dim
devuelve un vector, por lo que convertirlo para escribirlist
debería rotarlo; por ej[,c("rows","cols"):=as.list(dim(get(objectName))),by=objectName]
. El problema es queas.list
tiene sobrecarga de llamadas y también copia el vector pequeño. Si la eficiencia es un problema a medida que aumenta el número de grupos, háganoslo saber.x[,mynames:=list(mean(b)*4,sum(b)*3),by=a,with=FALSE][]
) ahora arroja una advertencia, ¿entonces tal vez lo elimine? En una nota relacionada, ¿alguien ha sugerido que, conoptions(datatable.WhenJisSymbolThenCallingScope=TRUE)
, una tarea comox[,mynames:=list(mean(b)*4,sum(b)*3),by=a]
debería funcionar? Parece que eso sería consistente con los otros cambios, aunque supongo que podría romper demasiado código de usuario existente (?).by=a
funcionará, pero devuelve una respuesta diferente. Los agregadosmean(a)
ysum(a)
se reciclan dentro de cada grupo cuandoby=a
. Sinby=a
él, simplemente pega elmean
ysum
para la columna completa en cada celda (es decir, números diferentes).La siguiente notación abreviada puede ser útil. Todo el crédito va a Andrew Brooks, específicamente este artículo .
fuente