¿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?

bycomo @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
withargumento (desaconsejamos este argumento cuando sea posible):fuente
data.table(objectName=ls())[,c("rows","cols"):=dim(get(objectName)),by=objectName](Estoy usandodata.table1.8.11)dimdevuelve un vector, por lo que convertirlo para escribirlistdebería rotarlo; por ej[,c("rows","cols"):=as.list(dim(get(objectName))),by=objectName]. El problema es queas.listtiene 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=afuncionará, pero devuelve una respuesta diferente. Los agregadosmean(a)ysum(a)se reciclan dentro de cada grupo cuandoby=a. Sinby=aél, simplemente pega elmeanysumpara 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