2011-06-15 18 views
7

Tengo un marco de datos, y quiero hacer algunos cálculos con columnas existentes y crear una nueva columna en mi conjunto de datos que es una combinación de existentes ... Puedo hacer esto fácilmente fuera de la función ... pero si envuelvo el código en una función, los cambios que hice (funciones internas) no son visibles fuera de la función ... es decir, la nueva columna no existe ...Cómo agregar una columna en el marco de datos dentro de una función

agradecer código de muestra para hacer esto ...

+0

Ayudaría saber qué software está usando, y ver un ejemplo mínimo donde las cosas van mal. – caracal

+1

si se trata de R necesita devolver nuevos valores de las funciones por 'return (data_frame_I_work_with)' o 'return (column_I_made)' –

Respuesta

7

Supongo que se trata de R ... R no pasa argumentos por referencia (entornos y clases de referencia (S5) son una excepción, pero esto está fuera de la corriente rango de abstracción). Por lo tanto, cuando se escribe

addThree<-function(x){ 
x<-x+3 
} 
4->y 
addThree(y) 

y sigue siendo 4 al final del código, porque dentro de la función, x es la nueva copia de y s valor, no el y en sí (de nuevo, no exactamente, pero esos son detalles de orden superior).

Por lo tanto, debe adaptarse al esquema de pase-por-copia de R y devolver el valor alterado y asignar de nuevo a la variable (usando redacción de edad, no hay procedimientos en I):

addThree<-function(x){ 
return(x+3) 
} 
4->y 
addThree(y)->y 
#y is now 7 

Don 'te preocupes, esto funciona sin problemas para objetos aún más complejos porque R es basura recogida y tiene evaluación perezosa.

Por cierto, se puede omitir return si desea devolver el último valor producido en la función, es decir, la definición addThree 's puede tener este aspecto:

addThree<-function(x) x+3 
+0

(+1) También es fácil llamar a una función en una instrucción 'within()' para crear una nueva columna data.frame sobre la marcha. – chl

+0

¿Qué diablos es S5? Tal vez quiso decir? ReferenceClasses – mdsumner

+0

@mdsummer Sure; Me dio la impresión de que es bastante conocido, pero al menos tiene un SEO terrible. – mbq

0

el mejor enfoque es utilizar mutate() de dplyr biblioteca. Ejemplo:

addcol = function(dat){ 
    dat1 = mutate(dat, x2=x1*2) 
    return(dat1) 
} 

dat es un marco de datos con una columna llamada "x1". Utilice esta función addcol(), el nuevo conjunto de datos ahora tiene una nueva columna llamada "x2" que es dos veces el valor de "x1", suponiendo que x1 es numérico.

Cuestiones relacionadas