3 Stimmen

Nur zu negativen Einträgen in einem Vektor addieren

Ich möchte zum Beispiel einen Vektor nehmen:

X <-  c(1,2,3,-1,-2,-3)

und addieren Sie 1 (oder eine andere im Voraus festgelegte Zahl) zu den Einträgen, in denen die Werte negativ sind, um Folgendes zu erhalten

1,2,3,0,-1,-2

Gibt es eine elegante Möglichkeit, dies zu tun?

8voto

IRTFM Punkte 250762

Eingereicht im R Golf Wettbewerb für dieses Problem:

X+(X<0)

Funktioniert, weil (X<0) für jeden gewünschten Fall 1 und für andere Fälle 0 erzwungen wird.

7voto

Andrie Punkte 169813

Verwenden. ifelse :

x + ifelse(x<0, 1, 0)
[1]  1  2  3  0 -1 -2

7voto

Gavin Simpson Punkte 163780

Eine Alternative, die vektorisiert, aber etwas ausführlicher ist, ist:

> X <-  c(1,2,3,-1,-2,-3)
> want <- X < 0
> X[want] <- X[want] + 1
> X
[1]  1  2  3  0 -1 -2

Der wichtigste Schritt besteht darin, Indizes zu erzeugen, bei denen X negativ ist ( want ). Wir verwenden dies dann, um X und addiere nur zu diesen 1.

Ob die Vektorisierung die Anzahl der oben genannten Funktionsaufrufe aufwiegt, überlasse ich anderen zur Diskussion (ich bezweifle, dass es für die meisten Probleme einen Unterschied macht).

3voto

MvG Punkte 54213

Vielleicht nicht die lesenswerteste Lösung, aber ich werde sie trotzdem zum Spaß veröffentlichen:

> pmax(X, X+sign(X)*(-1))
[1]  1  2  3  0 -1 -2

0voto

user1021713 Punkte 2053

Diesen Befehl kann man auch verwenden:

X <-  c(1,2,3,-1,-2,-3)
X[which(X < 0)] <- X[which(X < 0)] +1

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X