Tengo una función que devuelve dos valores en una lista. Ambos valores deben agregarse a una tabla de datos en dos columnas nuevas. La evaluación de la función es costosa, por lo que me gustaría evitar tener que calcular la función dos veces. Aquí está el ejemplo:¿Agregar varias columnas a R data.table en una llamada de función?
library(data.table)
example(data.table)
DT
x y v
1: a 1 42
2: a 3 42
3: a 6 42
4: b 1 4
5: b 3 5
6: b 6 6
7: c 1 7
8: c 3 8
9: c 6 9
Aquí hay un ejemplo de mi función. Recuerdo que indican que se encuentra de cómputo costoso, además de eso no hay forma de deducir un valor de retorno de los otros valores dados (como en el ejemplo siguiente):
myfun <- function (y, v)
{
ret1 = y + v
ret2 = y - v
return(list(r1 = ret1, r2 = ret2))
}
Ésta es mi manera de agregar dos columnas en una declaración . Sin embargo, uno necesita llamar a myfun dos veces:
DT[,new1:=myfun(y,v)$r1][,new2:=myfun(y,v)$r2]
x y v new1 new2
1: a 1 42 43 -41
2: a 3 42 45 -39
3: a 6 42 48 -36
4: b 1 4 5 -3
5: b 3 5 8 -2
6: b 6 6 12 0
7: c 1 7 8 -6
8: c 3 8 11 -5
9: c 6 9 15 -3
¿Alguna sugerencia sobre cómo hacer esto? Podía guardar r2
en un entorno separado cada vez que llamo a myfun, solo necesito una forma de agregar dos columnas por referencia a la vez.
¿Por qué su función no toma un marco de datos y devuelve un marco de datos directamente? 'Myfun <- function (y, v) { RET1 = y + v RET2 = y - v retorno (lista (r1 = RET1, r2 = RET2)) } –
@Etienne Debido a que copia las entradas para crear una nueva salida. Florian está utilizando 'data.table' para su eficiencia de memoria con grandes conjuntos de datos; no copia 'x',' y' o 'v' en absoluto, ni siquiera una vez. Piensa en conjuntos de datos de 20 GB en RAM. –