2011-12-08 8 views
7

Tengo las siguientes columnas en mi conjunto de datos:Creación de una nueva variable a partir de una tabla de búsqueda

presult  aresult 
    I   single 
    I   double 
    I   triple 
    I   home run 
    SS  strikeout 

me gustaría añadir una tercera columna "bases" que depende del valor del resultado en la columna un resultado.

Por ejemplo, me gustaría que las bases sean 1 para una sola, 2 para una doble, 3 para una triple, 4 para un jonrón y 0 para un tachado.

Por lo general, me gustaría crear la nueva variable de la siguiente manera:

dataset$base<-ifelse(dataset$aresult=="single", 1, 0) 

El problema es que no sé cómo codificar la nueva variable en sin establecer todas las otras variables a cero.

Respuesta

14

definir su tabla de búsqueda

lookup= data.frame( 
     base=c(0,1,2,3,4), 
     aresult=c("strikeout","single","double","triple","home run")) 

a continuación, utilizar unirse a plyr

dataset = join(dataset,lookup,by='aresult') 
+0

un poco más detallado que la solución de Dieter, pero con esto tienes la flexibilidad de definir el mapa aresult-> base. – LouisChiffre

1
dataset$base <- as.integer(as.factor(dataset$aresult)) 

Dependiendo de su as.factor de datos() podrían omitirse, ya que en muchos casos las cadenas son el factor de forma predeterminada, por ejemplo, con read.table

+0

¿Cómo puedo especificar qué valor tiene cada resultado? –

+0

Buen enfoque, pero para que esto funcione, "tachado" debe ser el primero en la lista, y luego debe restar 1. – Andrie

+0

@burton mi solución le permite hacer eso – LouisChiffre

13

Aquí es cómo utilizar un vector llamado así por las operaciones de búsqueda:

Definir datos de prueba :

dat <- data.frame(
    presult = c(rep("I", 4), "SS", "ZZ"), 
    aresult = c("single", "double", "triple", "home run", "strikeout", "home run"), 
    stringsAsFactors=FALSE 
) 

Definir un vector numérico llamado con las puntuaciones:

score <- c(single=1, double=2, triple=3, `home run`=4, strikeout=0) 

uso de vectores de indexación para que coincida con las puntuaciones con los resultados:

dat$base <- score[dat$aresult] 
dat 
    presult aresult base 
1  I single 1 
2  I double 2 
3  I triple 3 
4  I home run 4 
5  SS strikeout 0 
6  ZZ home run 4 

Información adicional:

Si no desea para construir el vector nombrado a mano, digamos en el caso donde tenga grandes cantidades de datos, entonces hágalo de la siguiente manera:

scores <- c(1:4, 5) 
names(scores) <- c("single", "double", "triple", "home run", "strikeout") 

(O lea los valores y nombres de los datos existentes. Se trata de construir un vector numérico y luego asignar nombres)

+0

buen truco para usar un vector con nombre. He aprendido algo aquí. – LouisChiffre

+2

+1 Gran idea para usar un vector con nombre. ¡Ojalá hubiera visto/pensado esto hace años! –

+0

@Andrie. ¿Hay alguna forma de hacerlo sin tener que especificar las filas?Tengo un conjunto de datos con miles de filas. –

2

Una alternativa a Dieter's answer:.

dat <- data.frame(
    presult = c(rep("I", 4), "SS", "ZZ"), 
    aresult = c("single", "double", "triple", "home run", "strikeout", "home run"), 
    stringsAsFactors=FALSE 
) 

dat$base <- as.integer(factor(dat$aresult, 
    levels=c("strikeout","single","double","triple","home run")))-1 
Cuestiones relacionadas