So erstellen Sie einen leeren R-Vektor, um neue Elemente hinzuzufügen


90

Ich möchte R in Python verwenden, wie vom Modul Rpy2 bereitgestellt. Ich stelle fest, dass R sehr bequeme []Operationen hat, mit denen Sie die spezifischen Spalten oder Zeilen extrahieren können. Wie kann ich eine solche Funktion mit Python-Skripten erreichen?

Meine Idee ist es, einen R-Vektor zu erstellen und diese gewünschten Elemente in diesen Vektor einzufügen, so dass der endgültige Vektor der gleiche ist wie der in R. Ich habe einen erstellt seq(), aber es scheint, dass er eine Anfangsziffer 1 hat, so dass das Endergebnis immer wäre Beginnen Sie mit der Ziffer 1, was ich nicht will. Gibt es einen besseren Weg, dies zu tun?

Antworten:


94
vec <- vector()

Siehe auch Vektorhilfe

?vector

54

Ich ordne einen Vektor mit vor

> (a <- rep(NA, 10))
 [1] NA NA NA NA NA NA NA NA NA NA

Sie können dann [] verwenden, um Werte einzufügen.


Dies ist die beste Antwort, wenn die Länge des Vektors von Anfang an bekannt ist, da er am speichereffizientesten ist
stevec

24

Sie können so einen leeren Vektor erstellen

vec <- numeric(0)

Fügen Sie dann Elemente mit c () hinzu

vec <- c(vec, 1:5)

Wie Romunov jedoch sagt, ist es viel besser, einen Vektor vorab zuzuweisen und ihn dann zu füllen (da dadurch vermieden wird, dass jedes Mal, wenn Sie Elemente hinzufügen, eine neue Kopie Ihres Vektors neu zugewiesen wird).


Ich mag Ihre Lösung mit numeric (), aber meine Erfahrung hat mich dazu gebracht, NA anstelle von 0 zu verwenden (wenn Sie numeric (2) verwenden, erhalten Sie 0 0). Aber das ist meine persönliche Präferenz.
Roman Luštrik

Danke vielmals!! Aber ist es möglich, das vorherige nach dem Hinzufügen eines neuen Elements freizugeben? soll ich einfach rm () verwenden?
Ligwin

Es gibt ein weiteres Problem, bei dem typeof (numerisch (0)) "double" ergibt, während die gewünschten Elemente "integer" ergeben. Beim Hinzufügen wurde der Fehler "Der Typ für den neuen Wert kann nicht unterschiedlich sein" ausgegeben. Wie wird konvertiert?
Ligwin

Wenn Sie in Python arbeiten, ist das "as" ein Schlüsselwort. Außerdem hat Python keine solchen Datentypen, daher denke ich, dass "as.integer" nicht funktioniert.
Ligwin

romunov - numerisch (0) bedeutet, einen numerischen Vektor mit einer Länge von 0 (dh keine Elemente) zu erstellen, keinen Vektor mit einer Länge von 1, wobei dieses Element 0 ist
Aaron Statham

6

Um einen leeren Vektor zu erstellen, verwenden Sie:

vec <- c();

Bitte beachten Sie, dass ich keine Annahmen über den von Ihnen benötigten Vektortyp mache, z. B. numerisch.

Sobald der Vektor erstellt wurde, können Sie ihm folgende Elemente hinzufügen:

So fügen Sie beispielsweise den numerischen Wert 1 hinzu:

vec <- c(vec, 1);

oder, um einen Zeichenfolgenwert "a" hinzuzufügen

vec <- c(vec, "a");

4
Hast du das tatsächlich versucht? vec <- c()setzt vec auf NULL. Wenn Sie einen leeren Vektor möchten vec <- character(), würden Sie verwenden , vec <- numeric()etc.
Matthew Wise

5

Ich habe auch gesehen

x <- {}

Jetzt können Sie einen Vektor beliebiger Dimension verketten oder binden x

rbind(x, 1:10)
cbind(x, 1:10)
c(x, 10)

2
Dies ist genau das Gleiche wie x <- NULLund erzeugt nichts anderes als einen Verweis auf das Nirgendwo.
Joris Meys

3

Wie von Brani herausgestellt, ist vector () eine Lösung, z

newVector <- vector(mode = "numeric", length = 50)

gibt einen Vektor mit dem Namen "newVector" mit 50 "0" als Anfangswerten zurück. Es ist auch ziemlich üblich, den neuen Skalar einfach zu einem vorhandenen Vektor hinzuzufügen, um zu einem erweiterten Vektor zu gelangen, z

aVector <- c(aVector, newScalar)


2

In rpy2 können Sie mit ".rx" denselben Operator wie "[" mit R erhalten. Weitere Informationen zum Extrahieren mit rpy2 finden Sie in der Dokumentation

Wenn Sie sich beim Erstellen von Vektoren mit Python auskennen, sollte dies kein Problem darstellen. Weitere Informationen zum Erstellen von Vektoren finden Sie in der Dokumentation


Ich habe zu diesem Zweck eine Funktion in Python erstellt, die sehr kompliziert ist und ich bin mir nicht sicher, wie weit sie angewendet werden könnte. Jetzt denke ich mit diesen Operatoren, das Leben könnte viel einfacher sein :)
Ligwin
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.