2016-07-26 14 views
0

Ich bin kein Experte in R ...R wie oben Niveau zu halten und die all anderen Ebene ändern

In meinen Trainingsdaten gibt es ein Feld Source genannt ist, die 30 Stufen hat, ich möchte nur zu Behalten Sie die obersten 2 Ebenen, da sie die Mehrheit sind, und müssen Sie alle anderen 28 Ebenen in "Andere" ändern. Auf diese Weise wird es für mich einfacher, One-Hot Encoding später anzuwenden.

Ich habe hier geprüft Lösungen: Solution 1 und Solution 2

Und ich habe noch stucked ...

Hier sind die wichtigsten Lösungen, die ich versucht:

train ist die Original-Trainingsdaten, x_train wird nur eine Kopie. Source ist eine Faktorvariable. Die Top 2 Ebenen sind 'S122', die ebenen1 ist, und 'S133', die Level8

1 Versuchen Ich verwende which

Hier ist, so dass ich nicht konvertieren müssen Faktor zuerst in Charakter. Vor der Verwendung von which habe ich versucht, einen Faktor in ein Zeichen umzuwandeln. Die Ergebnisse sind die gleichen, hat nicht funktioniert .... Nachdem Sie den Code hier läuft, nichts geändert, aber hinzugefügt, nur 1 mehr Ebene namens ‚Andere‘ ...

x_train <- train 
levels(x_train$Source) <- c(levels(x_train$Source), "Other") 
x_train$Source[which((x_train$Source != 'S122') && (x_train$Source != 'S133'))] <- 'Other' 
str(x_train$Source) 

der Zwischenzeit, in diesem Fall, ich bin unter Verwendung von Methoden wie revalue() nicht, weil es 28 Level ist geändert werden müssen, will ich nicht 28 Werte in einem Verfahren schreiben ....

Versuchen 2

Dann wechselte ich zu einem sehr einfach so, Iteration ... Ich habe versucht, while Schleife auch nicht funktioniert.

x_train <- train 
for (i in 1:30) { 
    if (i == 1 || i == 8) { 
    next 
    } 
    levels(x_train$Source)[i] <- 'Other' 
} 

Nach dieser Methode nicht alle 28 Stufen verändert werden, und ich habe realisiert, während die Werte dieser Ebenen die Länge der Gesamtpegel zu geändert wurden, verändert sich, und der Index wird geändert. Deshalb habe ich zu while Schleife geändert, aber noch hat es nicht funktioniert ....

Daher ist es eine Möglichkeit für mich, nur die Top-2 Niveau zu halten und alle anderen Ebenen in ‚Andere‘ ändern?

+0

Haben Sie dieses Problem gelöst? Wenn ja, bitte teilen Sie, wenn nicht, fügen Sie bitte ein [reproduzierbares Beispiel] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example). – shayaa

+0

Ja, ich löste das Problem auf eine einfache Weise, aber sieht albern aus, ich werde das nach der Arbeit heute teilen ~ –

Antwort

1

Dies ist kein reproduzierbares Beispiel, da Sie die Daten nicht bereitstellen, sondern davon ausgehen, dass Ihr Faktor Teil des Zuges ist, den Sie verwenden können.

levels(train$source) <-c("S122", "S133", rep("Other",3)) 

Stellen Sie sich zum Beispiel die titanischen Daten vor.

titanic <- reshape2::melt(Titanic) 
head(titanic) 
    Class Sex Age Survived value 
1 1st Male Child  No  0 
2 2nd Male Child  No  0 
3 3rd Male Child  No 35 
4 Crew Male Child  No  0 
5 1st Female Child  No  0 
6 2nd Female Child  No  0 

Angenommen nun, dass ich die Faktoren, so dass die höchsten beiden Faktoren sind in einer Klasse, und die anderen Faktoren sind in einer anderen Klasse neu kennzeichnen wollte. Ich brauche keine for-Schleifen.Ich schreibe gerade

levels(titanic$Class) <-c("High", "High", "Low", "Low") 

Nun, wenn ich die Ebene sehe ich

titanic 
    Class Sex Age Survived value 
1 High Male Child  No  0 
2 High Male Child  No  0 
3 Low Male Child  No 35 
4 Low Male Child  No  0 
5 High Female Child  No  0 
6 High Female Child  No  0 
+0

Das ist eine gute Inspiration. Während ich dies als die Lösung wählen werde, muss eine Sache korrigiert werden, die 'levels (train $ source) <-c (" S122 ", rep (" Andere ", 6)," S133 ", rep (" Andere ", 22)) '. Weil in meinem Fall "S133" Level 8 ist, aber es hat die obersten 2 Counts, "S122" ist Level 1 und es hat Top 1 Counts, ich muss diese Levels zwischen "S122" und "S133" in "Other" ändern und ändern Sie diese nach S133 auch in "Andere". –

+0

Ja, das sieht richtig aus. Nächstes Mal können Sie Leuten helfen, die Ihnen helfen möchten, indem Sie einen [minimalen Datensatz, der Ihrem Problem ähnelt] teilen (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible- Beispiel). Auf diese Weise würde ich die Reihenfolge der Ebenen Ihrer Faktoren kennen. – shayaa

0

Schließlich, ich dieses Problem gelöst, aber die Lösung ist nicht sehr intelligent. Also, Wenn es eine bessere Lösung für dieses Problem gibt, zögern Sie nicht, es hier.

Lasst uns den größten Teil erinnern, die ich in der Frage erwähnt:

x_train ist die Kopie von train.

x_train $ Source hat 30 Ebenen, ebenen1 ist ‚S122‘ und Level8 ist ‚S133‘, ich will nur diese 2 Ebenen halten und die anderen 28 Ebenen als ‚Andere‘ gesetzt.

Wenn diese Beschreibung auf Sie immer noch nicht klar ist, ist hier das Beispiel:

Origional x_train $ Source 30 Ebenen

S122, S123, S124 .., S133, S134, ....

Schluss Quelle Ebenen x_train $

S122, Andere, S133

Meine Frage war, wie das Endergebnis zu erhalten, wie 30 Levels in 3 Ebenen

Hier ist die Lösung zu ändern:

x_train <- train 
summary(x_train$Source) 
levels(x_train$Source)[2] <- 'Other' 
for (i in 3:7) { 
    levels(x_train$Source)[3] <- 'Other' 
} 
summary(x_train$Source) 
for (j in 1:22) { 
    levels(x_train$Source)[4] <- 'Other' 
} 
summary(x_train$Source) 

Wie Sie sehen, gibt es in dem Code kann ist schwer codierenden Teil, was nicht gut ist.

Also, wenn es bessere Lösung gibt, sehr willkommen, es hier zu veröffentlichen!

+0

Cherry, bitte sehen Sie meine Änderungen zu dieser Frage, erklären, warum es am besten wäre, meine Lösung zu verwenden. – shayaa

+1

Hallo Shayaa, vielen Dank für die Geduld, deine Lösung zu modifizieren, jetzt kann ich verstehen, was du meinst. Fügen Sie einfach einen Kommentar zu Ihrer Lösung hinzu, damit dieser für meinen Fall passt. Aber deine Lösung ist eine gute Inspiration und eine gute Lernerfahrung für mich. Vielen Dank! –