webentwicklung-frage-antwort-db.com.de

Ersetzen Sie den angegebenen Wert im Vektor

Ich suche nach einer Funktion, die alle Vorkommen eines Werts durch einen anderen Wert ersetzt. Zum Beispiel möchte ich alle Nullen durch Einsen ersetzen. Ich möchte das Ergebnis nicht speichern eine Variable, die den Vektor jedoch anonym als Teil eines größeren Ausdrucks verwenden möchte.

Ich kann selbst eine passende Funktion schreiben:

> vrepl <- function(haystack, needle, replacement) {
+   haystack[haystack == needle] <- replacement
+   return(haystack)
+ }
> 
> vrepl(c(3, 2, 1, 0, 4, 0), 0, 1)
[1] 3 2 1 1 4 1

Ich frage mich jedoch, ob es eine Standardfunktion für diese Aufgabe gibt, vorzugsweise aus dem Paket base, als Alternative zu einem anderen häufig verwendeten Paket. Ich glaube, dass die Verwendung eines solchen Standards meinen Code wahrscheinlich lesbarer macht, und ich muss diese Funktion nicht neu definieren, wo immer ich sie brauche.

22
MvG

Vielleicht suchen Sie nach replace:

> x = c(3, 2, 1, 0, 4, 0)
> replace(x, x==0, 1)
[1] 3 2 1 1 4 1

Oder, wenn Sie keine x haben (aus bestimmten Gründen, warum nicht?):

replace(c(3, 2, 1, 0, 4, 0), c(3, 2, 1, 0, 4, 0)==0, 1)

Viele Leute sind mit gsub vertraut, daher können Sie auch eine der folgenden Möglichkeiten ausprobieren:

as.numeric(gsub(0, 1, x))
as.numeric(gsub(0, 1, c(3, 2, 1, 0, 4, 0)))

Aktualisieren

Nach dem Lesen der Kommentare ist vielleicht with eine Option:

with(data.frame(x = c(3, 2, 1, 0, 4, 0)), replace(x, x == 0, 1))
47

Eine weitere einfachere Möglichkeit ist:

 > x = c(1, 1, 2, 4, 5, 2, 1, 3, 2)
 > x[x==1] <- 0
 > x
 [1] 0 0 2 4 5 2 0 3 2
12
nico

So ersetzen Sie mehrere Nummern:

vec <- 1:10
replace(vec, vec== c(2,6), c(0,9)) #2 and 6 will be replaced by 0 and 9.

Bearbeiten:

für eine fortlaufende Serie können Sie dies vec <- c(1:10); replace(vec, vec %in% c(2,6), c(0,9)) tun, aber für vec <- c(1:10,2,2,2); replace(vec, vec %in% c(2,6), 0) können wir mehrere Werte durch einen Wert ersetzen.

5
TheMI

Für Faktor oder Zeichen Vektoren können wir revalue von plyr verwenden:

> revalue(c("a", "b", "c"), c("b" = "B"))
[1] "a" "B" "c"

Dies hat den Vorteil, dass Sie den Eingabevektor nur einmal angeben müssen, sodass wir eine Pipe verwenden können 

x %>% revalue(c("b" = "B"))
2
qwr

Die ifelse-Funktion wäre ein schneller und einfacher Weg, dies zu tun.

1
Greg Snow

Warum das Getue?

replace(haystack, haystack %in% needles, replacements)

Demo:

haystack <- c("q", "w", "e", "r", "t", "y")
needles <- c("q", "w")
replacements <- c("a", "z")

replace(haystack, haystack %in% needles, replacements)
#> [1] "a" "z" "e" "r" "t" "y"
0
MS Berends