2016-04-07 26 views
1

Hier ist ein Code-Schnipsel, wo ich versuchen ! zu verwenden:Unterschied zwischen und „-“ in r

demo <- <dataframe>[!which(<dataframe>$<col_name> == 0),] 

aber es ist mir nicht die korrekte Ausgabe zu geben.

Wenn ich - in:

demo <- <dataframe>[-which(<dataframe>$<col_name>== 0),] 

its me, die richtige Antwort zu holen.

Kann jemand erklären, warum das so ist?

+4

Es tut mir leid, aber das ist sehr einfach. '!' ist logische Negation, '-' ist (in diesem Fall) eine unäre arithmetische Operation. Wenn Sie '!' Auf ganzzahlige Werte anwenden, wird '0' zu' FALSE' und alle anderen Zahlen zu 'TRUE' gezwungen: versuchen Sie'! (0: 5) '. – Roland

+0

dann wie wäre es mit [welche ( $ ! = 0),] dies gibt mir eine richtige Antwort – deepesh

+1

Nun, sicher ist es. Ihnen ist bewusst, dass R eine logische, ganzzahlige und charakte- rische Teilmenge bietet? Und weißt du was 'was'? – Roland

Antwort

4

So which einen Vektor von Zeilenindizes zurück, für die <dataframe>$<col_name> == 0 ist zufrieden und kein logischer (WAHR/FALSCH) Vektor. Wenn du das also mit negierst! Sie bekommen Unsinn. Sie tun dies im Wesentlichen !c(0, 1, 2, 3, 4), die TRUE FALSE FALSE FALSE FALSE zurückgibt.

Das - Zeichen entfernt die Zeilen, die von der which Anweisung zurückgegeben werden, was Sie wollen.

Alternativ könnten Sie tun: demo <- <dataframe>[!<dataframe>$<col_name> == 0,]

+0

Und wenn keine Zeilen zurückkommen, bekommen Sie 'data [-integer (0),]' was wirklich alles vermasselt ... weshalb 'was' eine schlechte Idee ist. –

1

which gibt einen Index zurück, der verwendet werden kann, um einen data.frame (oder irgendetwas anderes) positiv/negativ zu indizieren. Aber ! ein Vektor von Positionen wird nur FALSE s zurückgeben. Versuchen Sie !5. Hier sind einige Beispiele:

df <- data.frame(col1=1:6, col2=rep(0:1, 3)) 
> df 
    col1 col2 
1 1 0 
2 2 1 
3 3 0 
4 4 1 
5 5 0 
6 6 1 

# an vector of positions 
> which(df$col2 == 0) 
[1] 1 3 5 

# ! this vector 
> !which(df$col2 == 0) 
[1] FALSE FALSE FALSE 

# - this vector 
> -which(df$col2 == 0) 
[1] -1 -3 -5 
+0

das ist nett .... danke – deepesh

1

Aufgrund dessen, was zurückgegeben wird:

> !which(x = mtcars$cyl == 4) 
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 

> -which(x = mtcars$cyl == 4) 
[1] -3 -8 -9 -18 -19 -20 -21 -26 -27 -28 -32 

Es ist auch bemerkenswert:

identical(mtcars[!mtcars$cyl == 4, ], 
+   mtcars[mtcars$cyl != 4, ]) 
[1] TRUE 
+0

Jetzt habe ich es, vielen Dank. – deepesh

4

Werfen wir einen Vektor Beispiel nehmen:

x <- c(1, 10, 30, 5) 

Ich möchte mich bei allen Vielfachen von 10 in diesem Vektor zu beseitigen. Der Vektor von booleans zu meinem Zustand entspricht, kann wie folgt

b <- x %% 10 == 0 

berechnet werden, wenn ich which(b) ausführen, wird dies die Indizes wieder in den TRUE Werte in b entsprechen, so alle Werte auszuschließen, die ein Vielfaches von 10 sind, ich kann

x[ -which(b) ] 

tun, aber wenn ich ! (der Negation-Operator) auf which(b) anstelle von - (der Befehl x[!which(b)] werden), wird das Ergebnis völlig falsch sein, das ist, weil die Negation o puerator kann auf ganze Zahlen angewendet werden, ohne einen Fehler zurückzugeben: Wenn die ganze Zahl gleich 0 ist, gibt sie TRUE zurück, und wenn die ganze Zahl von 0 verschieden ist, wird FALSE zurückgegeben (try !(-2:2)).

Deshalb, wenn ich das richtige Ergebnis wollen mithilfe von !, muss ich es anwenden direkt auf dem Vektor von booleans

x[ !b ] 
+0

jetzt ist klar, ich nahm "!" Zeichen zu sein als eine Negation. – deepesh