2014-09-16 16 views
5

ich folgende Datenrahmen haben:prüfen, ob eine Variable eine Zahl in R

> ddf = data.frame(name=c('a','b'), value=c(10,20)) 
> ddf 
    name value 
1 a 10 
2 b 20 

Ich versuche xx zu erhalten von ddf folgenden Befehl:

> xx = ddf[ddf$name=='a','value'] 
> xx 
[1] 10 
> xx = ddf[ddf$name=='c','value'] 
> xx 
numeric(0) 

Wie kann ich, wenn xx testen eine gültige Nummer und nicht 'numerisch (0)'. Ich habe versucht, folgende:

> is.numeric(xx) 
[1] TRUE 
> is.na(xx) 
logical(0) 
> is.null(xx) 
[1] FALSE 
> is.logical(xx) 
[1] FALSE 

EDIT: Ich für "xx = ddf [ddf $ name == 'a', 'Wert']" fragen, haben aus verschiedenen ddf Datenrahmen. Manchmal enthält ddf kein 'a' und daher wird kein Wert zurückgegeben. Ich möchte das erkennen.

+0

ist jedoch zu beachten, dass „gültige Zahl“ ist kein Parameter in 'R'. Was, wenn Sie keine "NA" - oder "Inf" -Werte zulassen wollen? Stellen Sie sicher, dass Sie genau wissen, was Sie testen müssen! –

+0

Sie könnten seine Länge überprüfen –

+0

Ich habe meine Frage für was genau ich brauche bearbeitet. Ich denke, Länge (xx)> 0 wird am besten sein. – rnso

Antwort

6

Der einfachste Weg, dies mit Base R zu tun, ist die Länge von xx zu überprüfen.

if(length(xx)>0) 
    { 
    <do something> 
    } 

Wenn Sie möchten, zu überprüfen, ob die Variable auch numerische Verwendung is.numeric

if (length(xx)>0 & is.numeric(xx)) 

Zum Beispiel ist unter Ihrem Beispiel:

xx <- ddf[ddf$name=='a','value'] 

is.numeric(xx) & length(xx)>0 
[1] TRUE 


xx <- ddf[ddf$name=='c','value'] 

is.numeric(xx) & length(xx)>0 
[1] FALSE 


xx <- ddf[ddf$name=='a','name'] 

is.numeric(xx) & length(xx)>0 
[1] FALSE 
+0

Das verifiziert nur, dass da "etwas da ist", aber nicht, dass es "numerisch" ist und nicht irgendeine andere Klasse, also muss dies zusätzlich zu dem OP-Code sein, nicht statt dessen. Ich wollte nur diesen Punkt klarstellen. –

+0

@CarlWitthoft abhängig von der Situation, die möglicherweise ein Problem sein oder nicht, habe ich den Code aktualisiert. – nico

+0

Danke - schöne, detaillierte Änderungen dort! –

4
library(assertive) 
is_a_number(xx)   # returns TRUE or FALSE 
assert_is_a_number(xx) # throws an error if not TRUE 

Dies kombiniert zwei Tests. Zuerst überprüft es, dass xx Klasse numeric (integer ist auch OK, da die zugrunde liegende Überprüfung von is.numeric getan wird), und zweitens überprüft, dass die Länge xx eins ist.

0

Der folgende Code verwendet reguläre Ausdrücke, die zur Bestätigung Die Zeichenfolge on enthält numerische Ziffern und mindestens eine Ziffer. Siehe unten:

grepl("^[0-9]{1,}$", xx) 

Oder wenn Sie mit negativen Zahlen und Dezimalstellen befassen müssen:

grepl("^[-]{0,1}[0-9]{0,}.{0,1}[0-9]{1,}$", xx) 
+0

Was ist mit Dezimalpunkt? – rnso

Verwandte Themen