2016-04-13 4 views
0

Ich bin ein Anfänger in R. Ich habe mit einem Datenrahmen (mit dem Namen df1) gearbeitet. HOUSE. NO , E1, D11, DC11 sind verschiedene Spaltennamen im Rahmen. Das folgende ist das Ergebnis der logischen Unterteilung, die ich durchgeführt habe.Unerklärliche Mismatch in der logischen Untergruppe in R

df1 
    HOUSE.NO D11 DC11 E1 
75 16/215 2 2 NA 
76 15/262 1 1 2 
77 16/220 1 1 2 
78 14/13 1 1 1 
79  14/9 2 2 NA 
df1$HOUSE.NO[df1$E1==1&any(!df1$D11==1,!df1$DC11==1)] 
[1] NA  "14/13" NA 

Aber für den „14/13“ Wert, wenn ich individuell den Wert der logischen berechnet, kam es FALSE aus.

df1$E1[df1$HOUSE.NO=="14/13"]==1&any(df1$D11[df1$HOUSE.NO=="14/13"]!=1, df1$DC11[df1$HOUSE.NO=="14/13"]!=1) 
[1] FALSE 

Ich kann nicht sehen, wie dies zustande kam. Ich habe auch unabhängig den Datenrahmen überprüft und es hat Sinn gemacht, dass es falsch wird. Bitte lassen Sie mich wissen, warum das passiert ist.

+1

zeigen Bitte ein reproduzierbares Beispiel – akrun

+0

@akrun In meinem Fall, ich habe keinen anderen Ort, an dem diese passiert. Brauchen Sie von mir zusätzliche Informationen aus dem Datenrahmen, an dem ich gerade arbeite? –

+0

Ich zeige nicht, was Sie den ganzen Datensatz zeigen. Wenn Sie eine Ausgabe der ersten 6 Zeilen oder so zeigen, die dieses Problem reproduzierbar ist, wird es leicht zu verstehen sein – akrun

Antwort

1

Ich denke, was Sie beobachten, ist die Tatsache, dass any gilt für einen ganzen Vektor, während == auf jedes Element des Vektors angewendet wird.

Zum Beispiel:

e1 <- c(1, 1, 1) 
d11 <- c(1, 2, 2) 
dc11 <- c(1, 1, 2) 
house <- c("14/13", "a", "b", "c") 

Wenn Sie testen diese

house[e1==1 & any(d11!=1, dc11!=1) ] 

alle Häuser sollen die Bedingung erfüllen, was richtig ist. Aber wenn man sich nur die Hausnummer 14/13 genauer ansieht, ist sein E1 sicher gleich 1, aber seine D11 und DC11 sind beide gleich 1. Das liegt daran, dass es im Vergleich speziell auf dieses Haus kein anderes Haus gibt im any Vergleich, um den "any" Test zu bestehen.

Mit anderen Worten: any(d11!=1, dc11!=1) eine einzige TRUE zurückgibt, wenn alle Häuser angewendet, weil sie (in unseren beiden Beispielen) zumindest auf Haus, für die D11 oder DC11 ist nicht gleich 1. Wenn Sie diese Einzel TRUE mit einem Mähdrescher vector of booleans (hier: c(TRUE, TRUE, TRUE)) mit &, gibt es den Vektor c(TRUE & TRUE, TRUE & TRUE, TRUE & TRUE) zurück.

Wenn Sie jetzt die Operation für die Hausnummer "14/13" ausführen, werden Sie (für den any Teil) any(d11[house=="14/13"]!=1, dc11[house=="14/13"]!=1) ausgeführt und erhalten Sie FALSE.

Abschließend den Befehl Sie ausführen möchten, ist

house[ e1[house=="14/13"]]==1 & any(d11!=1, dc11!=1) ] 

und nicht

house[ e1[house=="14/13"]]==1 & 
    any(d11[house=="14/13"]!=1, dc11[house=="14/13"]!=1) ] 
Verwandte Themen