webentwicklung-frage-antwort-db.com.de

Gibt es bei der Verwendung von dplyr eine Alternative zur "revalue" -Funktion von plyr?

Ich bin ein Fan der revalue Funktion ist plyr zum Ersetzen von Strings. Es ist einfach und leicht zu merken.

Ich habe jedoch neuen Code nach dplyr migriert, der anscheinend keine revalue-Funktion aufweist. Was ist das akzeptierte Idiom in dplyr für Dinge, die zuvor mit revalue erledigt wurden?

16
fmark

Es gibt eine recode-Funktion, die mit dplyr version dplyr_0.5.0 beginnt und revalue von plyr sehr ähnlich ist.

Beispiel aus der recode-Dokumentation Beispiele Abschnitt:

set.seed(16)
x = sample(c("a", "b", "c"), 10, replace = TRUE)
x
 [1] "a" "b" "a" "b" "b" "a" "c" "c" "c" "a"

recode(x, a = "Apple", b = "Bear", c = "Car")

   [1] "Car"   "Apple" "Bear"  "Apple" "Car"   "Apple" "Apple" "Car"   "Car"   "Apple"

Wenn Sie nur einige der Werte definieren, die Sie umkodieren möchten, wird der Rest standardmäßig mit NA gefüllt.

recode(x, a = "Apple", c = "Car")
 [1] "Car"   "Apple" NA      "Apple" "Car"   "Apple" "Apple" "Car"   "Car"   "Apple"

Dieses Verhalten kann mit dem Argument .default geändert werden.

recode(x, a = "Apple", c = "Car", .default = x)
 [1] "Car"   "Apple" "b"     "Apple" "Car"   "Apple" "Apple" "Car"   "Car"   "Apple"

Es gibt auch ein Argument .missing, wenn Sie fehlende Werte durch etwas anderes ersetzen möchten.

21
aosmith

Wir können dies mit chartr von base R machen

chartr("ac", "AC", x)

daten

x <- c("a", "b", "c")
3
akrun

Ich wollte die Antwort von @aosmith kommentieren, aber es fehlt mir an Ruf. Es scheint, dass heutzutage die Vorgabe der dplyr-Funktion von recode darin besteht, dass nicht festgelegte Ebenen nicht betroffen sind.

x = sample(c("a", "b", "c"), 10, replace = TRUE)
x
[1] "c" "c" "b" "b" "a" "b" "c" "c" "c" "b"

recode(x , a = "Apple", b = "banana" )

[1] "c"      "c"      "banana" "banana" "Apple"  "banana" "c"      "c"      "c"      "banana"

Um alle nicht angegebenen Ebenen in NA zu ändern, muss das Argument .default = NA_character_ eingefügt werden.

recode(x, a = "Apple", b = "banana", .default = NA_character_)

[1] "Apple"  "banana" "Apple"  "banana" "banana" "Apple"  NA       NA       NA       "Apple" 
2

Eine Alternative, die ich praktisch finde, ist die Mapvalues-Funktion für die data.tables Z

df[, variable := mapvalues(variable, old = old_names_string_vector, new = new_names_string_vector)]
0