16 TRANSFORMACIONES Y CREACIÓN DE NUEVAS VARIABLES

Para transformar una variable o crear una nueva, basta con asignarle la expresión deseada. Considérese el siguiente código.

a      <- 25
raiz.a <- sqrt(a)

En este caso, en adición al objeto a, que vale 25, se crea un nuevo objeto llamado raiz.a, cuyo valor es 5.

Para actualizar el contenido de un objeto, se asigna la expresión a un objeto con el mismo nombre del objeto transformado, así:

contador <- 18
contador <- contador + 1

En este caso, al final habrá un único objeto, llamado contador, cuyo valor es 19.

Asimismo, es posible crear un nuevo objeto, combinando dos o más objetos, tal y como se ilustra a continuación para el cálculo del índice de masa corporal.

peso  <- 65
talla <- 1.65
imc   <- peso/talla^2

Las situaciones ilustradas anteriormente son bastante sencillas, dado que se está operando sobre un único valor. Lo usual, sin embargo, es transformar un vector de datos.

Puesto que el objeto por excelencia para la organización de bases de datos es el data frame, se ilustrarán varios aspectos relacionados con la transformación de vectores dentro de estas estructuras. En este caso, también pueden crearse nuevos vectores o actualizarse los existentes, dependiendo de que la expresión se asigne a un objeto ya existente o que se use otro nombre.

Considérense las siguientes instrucciones:

base_datos <- data.frame(a = seq(1, 21, 2), b = rnorm(11))
c <- log(base_datos$a) + (base_datos$b)^2

La primera línea crea un data frame, con dos columnas o vectores: a, conformado por la secuencia de números entre 1 y 21, con incrementos de 2, y un segundo vector, llamado b, conformado por 11 números aleatorios de la distribución normal estándar (cf. 17). La segunda línea crea un vector llamado c, resultante de combinar los vectores a y b, acorde con la expresión allí definida. Un aspecto esencial es lograr que el objeto creado no quede aislado en el ambiente de trabajo, sino que se integre al data frame. En el anterior ejemplo, el objeto c, definido de esta manera, no forma parte del data frame base_datos, el cual sigue estando conformado únicamente por a y b. Existen múltiples maneras de evitar esta situación indeseable, las cuales se ilustran en el marco del data frame definido anteriormente, detallando únicamente lo concerniente a la segunda línea. Cualquiera de las siguientes instrucciones da lugar al mismo resultado: dentro del data frame base_datos se crea una columna llamada c, a partir de la expresión indicada.

base_datos$c <- log(base_datos$a) + (base_datos$b)^2
base_datos$c <- with(base_datos, log(a) + b^2)
base_datos   <- within(base_datos, c <- log(a) + b^2)
base_datos   <- transform(base_datos, c = log(a) + b^2)

La primera forma, no obstante ser la más directa, exige referenciar cada una de las variables antecedida por el nombre del data frame, lo cual puede recargar el código; en especial, si se usa una expresión compleja. Cuando se usa with, el vector resultante de evaluar la expresión se asigna a la columna c dentro del data frame base_datos. Las dos últimas opciones funcionan de manera similar, creando un data frame temporal adicionado con la nueva variable, el cual se sobrescribe al data frame original. Dentro de la función within es necesario utilizar <- como operador de asignación, mientras que con la función transform debe utilizarse el operador =.

Aunque tanto within como transform permiten realizar múltiples definiciones de manera simultánea, es necesario prestar atención a las particularidades del formato de aplicación de cada una de estas. Cuando se usa la función within, las diferentes definiciones se encierran entre llaves y se ubican en diferentes líneas. Tales definiciones se evalúan en el orden de aparición, lo que permite generar definiciones basadas en resultados que aparezcan previamente en la misma instrucción.

base_datos <- within(base_datos, {
              c <- a + b
              d <- c^2
              }) 

Cuando se usa transform, las diferentes definiciones se separan con comas y estas se evalúan de manera simultánea, lo que impide generar definiciones basadas en otras variables que se estén creando en la misma instrucción.

base_datos <- transform(base_datos, c = a + b, d = a/b)