In dem unten codierten R-Datenrahmen möchte ich alle Zeiten ersetzen, die durch B
angezeigt werden b
.
junk <- data.frame(x <- rep(LETTERS[1:4], 3), y <- letters[1:12])
colnames(junk) <- c("nm", "val")
Dies bietet:
nm val
1 A a
2 B b
3 C c
4 D d
5 A e
6 B f
7 C g
8 D h
9 A i
10 B j
11 C k
12 D l
Mein erster Versuch war, a for
und if
Anweisungen wie folgt zu verwenden:
for(i in junk$nm) if(i %in% "B") junk$nm <- "b"
Aber wie Sie sicher sehen können, ersetzt dies ALLE Werte von junk$nm
durch b
. Ich kann sehen, warum dies so ist, aber ich kann nicht scheinen, dass es nur die Fälle von Junk $ nm ersetzt, in denen der ursprüngliche Wert war B
.
HINWEIS: Ich habe es geschafft, das Problem mit zu lösen, gsub
aber im Interesse des Lernens möchte RI immer noch wissen, wie ich meinen ursprünglichen Ansatz zum Arbeiten bringen kann (wenn es möglich ist).
Antworten:
Einfacher, nm in Zeichen umzuwandeln und dann die Änderung vorzunehmen:
EDIT: Und wenn Sie tatsächlich nm als Faktoren beibehalten müssen, fügen Sie dies am Ende hinzu:
quelle
Ein weiterer nützlicher Weg, um Werte zu ersetzen
quelle
Kurze Antwort lautet:
Schauen Sie sich die Indexvektoren in R Einführung an (falls Sie sie noch nicht gelesen haben).
BEARBEITEN. Wie in den Kommentaren erwähnt, funktioniert diese Lösung für Zeichenvektoren, sodass Ihre Daten nicht funktionieren.
Für Faktor ist der beste Weg, das Level zu ändern:
quelle
c("B","C")
. Tunjunk$nm[junk$nm == "B"]
ist der bessere Weg.b
der Faktor nm zum Faktor nm addiert werden . Die Version von diliop ist in der Tat die bessere, wenn Sie mit Charakteren arbeiten möchten, nicht mit Faktoren. (Denken Sie immer zuerst an den Typ Ihrer Variablen!)%in%
und==
ist dieNA
Handhabung:c(1,2,NA)==1
gibtTRUE, FALSE, NA
aberc(1,2,NA) %in% 1
gibtTRUE, FALSE, FALSE
. Und ja, ich habe vergessen zu überprüfen, ob diese Arbeit: /Da die von Ihnen angezeigten Daten Faktoren sind, erschwert dies die Dinge ein wenig. Die Antwort von @ diliop nähert sich dem Problem, indem sie
nm
in eine Zeichenvariable konvertiert . Um zu den ursprünglichen Faktoren zurückzukehren, ist ein weiterer Schritt erforderlich.Eine Alternative besteht darin, die Ebenen des vorhandenen Faktors zu manipulieren.
Das ist ganz einfach und ich vergesse oft, dass es eine Ersatzfunktion für gibt
levels()
.Bearbeiten: Wie von @Seth in den Kommentaren angegeben, kann dies in einem Einzeiler ohne Verlust der Klarheit erfolgen:
quelle
levels()
. Wie wäre es mit dem einen Linerjunk <- within(junk, levels(nm)[levels(nm)=="B"] <- "b")
?Der einfachste Weg, dies in einem Befehl zu tun, besteht darin, einen Befehl zu verwenden
which
und die Faktoren auf diese Weise nicht in Zeichen umzuwandeln:quelle
Sie haben eine Faktorvariable in erstellt,
nm
sodass Sie dies entweder vermeiden oder den Faktorattributen eine zusätzliche Ebene hinzufügen müssen. Sie sollten auch vermeiden,<-
in den Argumenten zu data.frame () zu verwenden.Option 1:
Option 2:
quelle
data.frame
?b
als Ebene hinzufügen, sondern nur die Ebene ändern,B
auf dieb
.a <- data.frame(x<-1:10)
. Sein Spaltenname ist nichtx
sondern eher chaotischx....1.10
. Verwenden Sie besser data.frame (x = 1: 10). Dann wissen Sie, wie Ihr Spaltenname lautet.predict()
der Sie sich beschweren, wenn die Faktorenebenen in neuen Daten nicht mit denen übereinstimmen, die für das Modell verwendet wurden. Auf lange Sicht sauberer, um die Daten richtig formatieren zu können, als sich auf Abkürzungen zu verlassen. Ich bin damit einverstanden, dass es vielleicht einfacher ist, es nicht zu einem Faktor zu machen, aber wenn es bereits einer ist oder einer für eine Modellierungsübung sein muss ...Wenn Sie mit Zeichenvariablen arbeiten (beachten Sie, dass dies
stringsAsFactors
hier falsch ist), können Sie replace verwenden:quelle
Rufen Sie diese Funktion über die folgende Zeile auf.
quelle