2017-12-17 6 views
0

Dieser ist wirklich stumping mich. Ich kann nicht finden, was mit dieser Codezeile falsch ist, und ich benutze es in einer Funktion und es macht die gesamte Funktion fehl.Subset mit dem Namen numerisch in R Fehler

Dies ist ein Vektor der Klasse ‚Matrix‘, result.1:

SPY TLT VGK EEM BIV RWX IYR EWJ DBC GLD PCY LQD TIP 
-0.08 0.09 -0.07 -0.07 -0.09 -0.07 -0.07 -0.07 -0.066 -0.04 -0.08 -0.08 -0.08 

ich den Mittelwert dieses Vektors berechnen, indem diese Codezeile ausgeführt wird:

mean.momentum.1 <- mean(result.1) 

Das Ergebnis ist ein numerischer Wert ein Wert von -0,062309. Ich möchte die Namen der Spalten erhalten, die größer als der Mittelwert ist, so dass ich diesen Code ausführen:

names(result.1[,(result.1 > mean.momentum.1)]) 

Der Ausgang ist als ich erwarte, ein Zeichen Vektor „TLT“, „GLD“ zurück.

Hier ist das Problem: wenn ich dies mit einer zweiten, fast identischen Matrix result.2 mache, bekomme ich jedes Mal ein NULL Ergebnis, wenn ich das Ergebnis "TLT" bekommen sollte. Hier

ist die Matrix result.2:

SPY TLT VGK EEM BIV RWX IYR EWJ DBC GLD TIP PCY LQD 
-0.08 0.15 -0.07 -0.06 -0.054 -0.07 -0.07 -0.07 -0.06 -0.06 -0.07 -0.07 -0.06 

I berechnen, den Mittelwert der gleichen Methode wie oben (-0,05298) und benennen Sie es mean.momentum.2

Dann laufen diese Linie I:

names(result.2[,(result.2 > mean.momentum.2)]) 

Ich bekomme NULL jedes Mal zurück, wenn ich "TLT" erwarte. Was läuft falsch mit der Art, wie ich mich unterwerfe? Wenn ich die Linie laufen:

result.2 > mean.momentum.2 

ich einen logischen Vektor, bei dem TLT ist TRUE, aber es funktioniert nicht, wenn ich mit dieser Methode der Teilmenge versuchen. Es funktioniert in der ersten Instanz perfekt, aber funktioniert nie in der zweiten Instanz, und da ich NULL zurück bekomme, schlägt meine gesamte Funktion fehl.

Danke ...

+0

Es wäre gut, mit Daten zu beginnen und für beide Situationen Code zu zeigen. Wie du sagst, du verpasst etwas und die Sache, die du verpasst, ist höchstwahrscheinlich ein Fehler in deinem Code, den du nicht gesehen hast. Derzeit bitten Sie eine andere Person, Ihren Code zu debuggen, ohne ihn zuerst zu sehen. –

+0

Dies ist der gesamte Code, der zum Reproduzieren des Fehlers benötigt wird. –

+0

@JaredMarks Es ist höflich, den gesamten Code zur Verfügung zu stellen, der benötigt wird, um den Fehler zu reproduzieren. In diesem Fall würde das den Code zum Erstellen der Matrizen enthalten.Dies macht es einfach und schnell für Menschen, Ihnen zu helfen. –

Antwort

2

Verwenden colnames() und rownames() statt names() wenn sie auf eine Matrix verweisen:

mean.momentum.1 <- mean(result.1) 

colnames(result.1)[which(result.1 > mean.momentum.1)] 
## [1] "TLT" "GLD" 

Beachten Sie auch die Syntax von colnames() oben. Sie geben eine Teilmenge des Vektors colnames(result1) mit which() zurück, um die Elemente des Vektors auszuwählen, für die result.1 größer als mean.momentum.1 ist.

Dies funktioniert für result.2 auch fein:

mean.momentum.2 <- mean(result.2) 

colnames(result.2)[which(result.2 > mean.momentum.2)] 
## [1] "TLT" 
+1

Vielen Dank, ich habe vergessen, die Umgehung der Funktion which() zu verwenden. Irgendeine Idee warum es im Allgemeinen gut aber nicht in diesem Fall funktionierte? Entschuldigung, dass der Code nicht enthalten ist. –

+0

'names()' funktioniert nicht wirklich für Matrizen. Es wird keinen Fehler geben und es wird ein Ergebnis zurückgeben, aber man kann sich nicht darauf verlassen. Im ersten Fall ist das Ergebnis von 'names()' genau das, was Sie erwartet haben. Um ehrlich zu sein, verstehe ich nicht wirklich, was vor sich geht, aber es gibt eine Diskussion [hier] (https://stackoverflow.com/questions/24799153/what-is-the-difference-between-names-and-colnames) das könnte von Interesse sein. –