2012-10-15 8 views
5

Ho una semplice trasformazione della colonna di dati che può essere eseguita utilizzando un ciclo if/else, ma mi chiedevo se esistesse un modo migliore per farlo.Come modificare i valori delle colonne in un frame di dati?

La struttura dati iniziale è,

df <-data.frame(cbind(x=rep(10:15,3), y=0:8)) 
df 
    x y 
1 10 0 
2 11 1 
3 12 2 
4 13 3 
5 14 4 
6 15 5 
7 10 6 
8 11 7 
9 12 8 
10 13 0 
11 14 1 
12 15 2 
13 10 3 
14 11 4 
15 12 5 
16 13 6 
17 14 7 
18 15 8 

cosa devo fare è sostituire i valori nella colonna 'y' tale che

'0' gets replaced with '2', 
'1' gets replaced with '2.2', 
'2' gets replaced with '2.4', 
... 
... 
'6' gets replaced with '3.2' 
'7' gets replaced with '3.3' 
'8' gets replaced with '10' 

modo che finiscono con qualcosa di simile,

> df 
    x y 
1 10 2.0 
2 11 2.2 
3 12 2.4 
4 13 2.6 
5 14 2.8 
6 15 3.0 
7 10 3.2 
8 11 3.3 
9 12 10.0 
10 13 2.0 
11 14 2.2 
12 15 2.4 
13 10 2.6 
14 11 2.8 
15 12 3.0 
16 13 3.2 
17 14 3.3 
18 15 10.0 

Ho cercato e trovato diverse proposte ma non sono riuscito a farle funzionare. Uno dei tentativi era qualcosa di simile,

> levels(factor(df$y)) <- c(2,2.2,2.4,2.6,2.8,3,3.2,3.3,10) 

Error in levels(factor(df$y)) <- c(2, 2.2, 2.4, 2.6, 2.8, 3, 3.2, 3.3, : 
    could not find function "factor<-" 

Ma ottengo il messaggio di errore mostrato sopra.

Qualcuno può aiutarmi con questo?

+0

spiacenti Ben, il mio errore. Ho appena modificato il mio post originale con la modifica. –

risposta

5

Utilizzare il fatto che y+1 è un indice per la sostituzione

qualcosa come

replacement <- c(2,2.2,2.4,2.6,2.8,3,3.2,3.3,10) 
df <- within(df, z <- replacement[y+1]) 

Oppure, usando data.table per lo zucchero syntatic e l'efficienza della memoria

library(data.table) 
DT <- as.data.table(df) 

DT[, z := replacement[y+1]] 
+0

Grazie mnel, il tuo suggerimento usando l'interno ha funzionato perfettamente! –

3

ne dite:

mylevels <- c(2,2.2,2.4,2.6,2.8,3,3.2,3.3,10) 
df$z <- as.numeric(as.character(factor(df$y,labels=mylevels))) 

Questo corrisponde anche il risultato desiderato:

transform(df,z=ifelse(y==7,3.3,ifelse(y==8,10,2+y/5))) 
+0

Grazie, Ben. Il tuo suggerimento funziona altrettanto bene del suggerimento di mnel. –

Problemi correlati