2010-08-05 5 views
77

Ich möchte R in Python verwenden, wie von dem Modul Rpy2 zur Verfügung gestellt. Ich bemerke, dass R sehr bequeme [] Operationen hat, mit denen Sie die spezifischen Spalten oder Zeilen extrahieren können. Wie kann ich eine solche Funktion durch Python-Skripte erreichen?Wie erstelle ich einen leeren R-Vektor, um neue Elemente hinzuzufügen

Meine Idee ist es, einen R-Vektor zu erstellen und diese gewünschten Elemente in diesen Vektor, so dass der endgültige Vektor ist der gleiche wie in R. Ich habe eine seq() erstellt, aber es scheint, dass es eine erste Ziffer 1 hat, so das Endergebnis würde immer mit der Ziffer 1 beginnen, was ich nicht will. Also, gibt es einen besseren Weg, dies zu tun?

Antwort

43

I vorbelegt einen Vektor mit

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

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

+7

Sie brauchen nicht 'c()'. 'a <-rep (NA, 10)' funktioniert. Und man könnte eine Vektorklasse erzwingen, indem man einen bestimmten Typ von NA verwendet, z. B. "rep (NA_integer_, 10)" (siehe "help (" NA ")"). – Marek

+0

Natürlich könnten Sie c(), einen älteren Moment meinerseits auslassen. Gute Nachricht Marek, danke. –

21

Sie können einen leeren Vektor erstellen wie so

vec <- numeric(0) 

Und dann Elemente hinzufügen, c mit()

vec <- c(vec, 1:5) 

jedoch als romunov sagt, es ist viel besser, ein Vektor vorbelegt und dann Füllen Sie es auf (weil dadurch vermieden wird, dass jedes Mal, wenn Sie Elemente hinzufügen, eine neue Kopie Ihres Vektors neu zugeordnet wird)

+0

Ich mag Ihre Lösung mit numerischen(), aber meine Erfahrung hat mich dazu geführt, NA anstelle von 0 zu verwenden (wenn Sie numerisch (2) verwenden, erhalten Sie 0 0). Aber das ist meine persönliche Vorliebe. –

+0

Vielen Dank !! Aber ist es möglich, die vorherige nach dem Hinzufügen eines neuen Elements zu befreien? soll ich einfach rm() benutzen? – ligwin

+0

Es gibt ein anderes Problem, das typeof (numerisch (0)) "double" gibt, während die gewünschten Elemente "integer" ergeben. Wenn es hinzugefügt wird, wurde der Fehler "Der Typ für den neuen Wert kann nicht anders sein" angegeben. – ligwin

87

Siehe auch

helfen vector
?vector 
+3

Dies ist die beste Strategie zu verwenden. – Kevin

+3

Perfekte Antwort, und kann sogar das Risiko eines Fehlers durch ein herumliegendes Indice oder NA reduzieren! In jedem Fall ist genau das, was ich brauchte. – Mnescat

+2

Ich habe gerade bemerkt, dass ich schon vor einiger Zeit hier war und upvoted. Naja danke nochmal ;-) – greg121

4

ich auch

Jetzt gesehen habe
x <- {} 

können Sie einen Vektor in jeder Dimension zu x

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

Das ist genau das selbe wie 'x <- NULL', und erzeugt nichts anderes als eine Referenz auf Nirgendwo. –

1

In rpy2 verketten oder binden, die Art und Weise das bekommen Derselbe Operator wie "[" mit R soll ".rx" verwenden. Siehe die Dokumentation über extracting with rpy2

Zum Erstellen von Vektoren, sollte man sich mit Python auskennen, sollte es kein Problem geben. Siehe die Dokumentation über creating vectors

+0

Ich habe zu diesem Zweck eine Funktion in Python erstellt, die sehr kompliziert ist und ich bin mir nicht sicher, wie weit sie es anwenden könnte. Jetzt denke ich mit diesen Operatoren, das Leben könnte viel einfacher sein :) – ligwin

2

Wie von Brani aufgezeigt, ist vector() eine Lösung, z.B.

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

einen Vektor zurückgeben Namen "newVector" mit 50 "0" ist, als Anfangswerte. Es ist auch ziemlich üblich, den neuen Skalar einfach zu einem existierenden Vektor hinzuzufügen, um zu einem expandierten Vektor zu gelangen, z.

aVector <- c(aVector, newScalar)

3

eine leere Vektor Verwendung zu erstellen:

vec <- c(); 

Bitte beachten Sie, ich bin keine Annahmen über die Art des Vektors nicht, dass Sie benötigen, zum Beispiel numerisch.

Sobald der Vektor wurde erstellt, Sie Elemente hinzufügen können, wie folgt:

Zum Beispiel den numerischen Wert hinzufügen 1:

vec <- c(vec, 1); 

oder einen String-Wert „a“ hinzufügen

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

Hast du das tatsächlich versucht? 'vec <- c()' setzt vec auf 'NULL'. Wenn Sie einen leeren Vektor wollen, verwenden Sie 'vec <- character()', 'vec <- numeric()' usw. –