2012-10-15 14 views
5

Ich habe eine einfache Datenrahmenspaltentransformation, die mit einer if/else-Schleife durchgeführt werden kann, aber ich frage mich, ob es einen besseren Weg dafür gibt.Wie ändert man Spaltenwerte in einem Datenrahmen?

Der ursprüngliche Datenrahmen ist,

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 

, was ich tun muß, ist, die Werte in der Spalte ‚y‘ zu ersetzen, so dass

'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' 

, so dass ich am Ende mit etwas wie,

> 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 

Ich habe mehrere Vorschläge gesucht und gefunden, aber konnte sie nicht zur Arbeit bringen. Einer der Versuche war etwas wie,

> 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<-" 

Aber ich bekomme die oben gezeigte Fehlermeldung.

Kann mir jemand dabei helfen?

+0

Leider Ben mit, mein Fehler. Ich habe gerade meinen ursprünglichen Post mit dem Schnitt bearbeitet. –

Antwort

5

die Tatsache verwenden, dass y+1 ist ein Index für den Ersatz

so etwas wie

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

Oder data.table für syntaktischen Zucker und Speichereffizienz

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

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

Vielen Dank Mnel, Ihr Vorschlag mit der Innenseite funktioniert perfekt! –

3

Wie wäre:

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))) 

Dies passt auch Ihre gewünschte Ergebnis:

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

Danke Ben. Ihr Vorschlag funktioniert genauso gut wie der Vorschlag von mnel. –

Verwandte Themen