2011-04-19 8 views
11

Supponiamo di avere un dataframeCome creare una nuova variabile in un data.frame in base a una condizione?

x y 
1 1 
2 4 
4 5 

come è possibile aggiungere una nuova variabile al dataframe tale che se x è minore o uguale a 1 restituisce "buono" se x è compreso tra 3 e 5 si restituisce " male "altro ritorna" fiera "

x y w 
1 1 "good" 
2 2 "fair" 
5 5 "bad" 

Applicato il metodo mostrato da ocram., tuttavia questo qui non funziona.

d1 <- c("e", "c", "a") 
d2 <- c("e", "a", "b") 

w <- ifelse(d1 == "e" & (d2=="e"), 1, ifelse((d1 == "a") & (d2 =="b"), 2, ifelse(d1 == "e"),3,99)) 

Qualche idea? Grazie

+1

Vedere la funzione 'cut' – hadley

+0

L'ultimo codice non funziona poiché sono state digitate parentesi; dovrebbe essere sempre 'ifelse (cond, ifTrue, ifFalse)', mai 'ifelse (cond) ifTrue, ifFalse'. – mbq

+0

Grazie! notato così .. :) – eastafri

risposta

17

Una possibilità ovvia e diretta è quella di utilizzare "condizioni if-else". In quell'esempio

x <- c(1, 2, 4) 
y <- c(1, 4, 5) 
w <- ifelse(x <= 1, "good", ifelse((x >= 3) & (x <= 5), "bad", "fair")) 
data.frame(x, y, w) 

** Per la domanda aggiuntiva in fase di montaggio ** E 'questo che ci si aspetta?

> d1 <- c("e", "c", "a") 
> d2 <- c("e", "a", "b") 
> 
> w <- ifelse((d1 == "e") & (d2 == "e"), 1, 
+ ifelse((d1=="a") & (d2 == "b"), 2, 
+ ifelse((d1 == "e"), 3, 99))) 
>  
> data.frame(d1, d2, w) 
    d1 d2 w 
1 e e 1 
2 c a 99 
3 a b 2 

Se non si sente a proprio agio con la funzione ifelse, si può anche lavorare con le dichiarazioni if e else per tali applicazioni.

+0

Grazie a una tonnellata, tuttavia l'approccio è limitato solo a 2 condizioni? vedere la domanda modificata sopra – eastafri

+1

Ho modificato la mia risposta – Marco

3

Se si dispone di un numero molto limitato di livelli, è possibile provare a convertire y in fattore e modificarne i livelli.

> xy <- data.frame(x = c(1, 2, 4), y = c(1, 4, 5)) 
> xy$w <- as.factor(xy$y) 
> levels(xy$w) <- c("good", "fair", "bad") 
> xy 
    x y w 
1 1 1 good 
2 2 4 fair 
3 4 5 bad 
Problemi correlati