Wie um zu überprüfen, ob jedes element in einem Vektor von integer-oder nicht R?
Sagen, ich habe einen Vektor y, und ich möchte, um zu überprüfen, ob jedes element in y ist integer oder nicht, und wenn nicht, beenden mit einer Fehlermeldung. Ich habe versucht ist.integer(y), aber es funktioniert nicht.
- Es ist irgendwie eine schwere Frage, zu definieren, was genau eine "integer" ist oder nicht-Sie müssen klären, integer im Sinne von "ganze Zahl" vs integer-Datentyp. Sie befassen sich kaum mit dem Datentyp integer direkt in R (aber das ist, was ist.integer-tests für) -- werfen Sie einen Blick auf ist.die ganze ( ... ) zur Verfügung gestellt von Martin Maechler hier: stat.ethz.ch/pipermail/r-help/2003-April/032471.html
- Wenn Sie aufhören möchten Sie wissen, wo Sie aufgehört haben... also das man nicht eine ganze Zahl zuerst? Ein Vektor enthält nur einen Datentyp. Man kann also nicht bedeuten, dass integer der Typ, der nur Ganzzahl als in eine ganze Zahl. Auch das ist ein bisschen problematisch, weil nicht alle ganze zahlen sind ganze zahlen genau. Sie müssen auch eine Toleranz von Abweichung von genau einer ganzen Zahl. Fügen Sie die Antworten auf jene Dinge zu Ihrer Frage.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die einfachste (und Schnellste!) was ist wohl dieses:
...Also probieren wir es aus:
Wenn Sie wollen eine bessere Fehlermeldung:
y
istc('A', 2, 3, 4)
?könnten Sie tun:
oder
und wenn Sie möchten, eine einzelne
TRUE
oderFALSE
für die ganze Sache, legen Sie Sie inall()
, z.B.:Hier ist eine andere Weise (mit dem gleichen trick, wie Justin zu vergleichen jede Zahl an, die Zahl gezwungen, sich in die "integer" - Typ):
Machen Sie Ihren test:
Nicht wissen, welche schneller ist Tim ' s Weg oder so, aber:
oder:
identical()
stattall.equal()
, daall.equal(3.00000001,3L)
ist nicht wirklichTRUE
.FALSE
für mich, aber ja, Sie sind richtig. Die Subtraktion-Technik ist wahrscheinlich ein wenig mehr narrensicher...is.integer(2.0)
istFALSE
als R sieht es, aber für andere Absichten und Zwecke, es ist eine schöne ganze Zahl.Ging ich in eine komplett andere Richtung, dann Tim (ich mag seine besser obwohl mein Ansatz funktioniert auf einer gemischten vector-das ist ein Charakter-Vektor mit ganzen zahlen etc.):
BEARBEITEN: verändert die Funktion, wie es funktioniert nur auf character-Vektoren.
Dies funktioniert auf Vektoren der Klasse character als auch für den Fall, Sie haben einen Charakter-Vektor mit verschiedener Anzahl miteinander vermischt, sondern wurden dazu gezwungen Charakter.
y<-1:1e5; system.time( int.check(y) )
dauert etwa 1,8 Sekunden. Meine version dauert 0,01 oder weniger 😉y<-c(1:1e5, "x")
; )int.check("1e6")
gibt FALSE zurück.überprüfung der folgenden Punkte hilft mit einer knackigen, wenn die Bedingung, die wir verwenden können, die auf scripting.
gibt
sff <- 'a'
gibt'a'
als das Ergebnis.Wenn du floating-point-Darstellung-Fehler, versuchen Sie:
In meiner Anwendung, ich hatte ernsthaft brutalen floating-point-Darstellung-Fehler, so dass gilt:
den Rest geteilt durch war man. Ich fand, dass musste ich Runde, bevor ich nahm die ganze Zahl ist. Ich denke alle dieser tests Versagen, in dem Fall, wo Sie wollte, die vor 89 zu zählen als eine ganze Zahl. Die "alle.gleich" - Funktion ist dazu gedacht, den besten Weg zur Verwaltung von floating-point-Darstellung-Fehler, aber:
wie in meinem Fall, hätte (und hat) bei einer falsch-negativ-für einen integer-Wert überprüfen.
EDIT: benchmarking, fand ich, dass:
war überall der besten Darsteller.
in der Regel gut funktioniert, oft genauso schnell.
funktioniert, aber nicht so schnell wie die anderen
wenn der Vektor nicht zahlen, hatte schrecklichen Leistung (Sicherheit, weil es geht um die Mühe, die Schätzung der Differenz).
wenn der Vektor wurde alle integer-Werte zurückgegeben, die den falsche Ergebnis (vorausgesetzt, die Frage wurde gemeint, um zu überprüfen, für integer-Werte integer-Typen).