2016-10-31 1 views
-1

Ich habe folgenden Datenrahmen:Filterung mit logischen + NA-Wert in einer Spalte

df <- data.frame("Logical"=c("true",NA,"false","true","","false"), 
      "Numeric"=c(1,2,3,4,5,6)) 

unique(df$Logical) 
length(df$Logical == TRUE) 

Ich versuche, herauszufinden, wie viele TRUE -Werten ich in meinen df$Logical Spalt habe. Aber ich vermisse etwas und length(df$Logical == TRUE) gibt keine Datensätze in meiner logischen Spalte zurück.

Was ich in diesem speziellen Fall falsch mache. Das gewünschte Ergebnis sollte 2 für TRUE -Werte in df$Logical Spalte sein. Vielen Dank im Voraus.

Antwort

0

Wir müssen die Zeichenfolge in Kleinbuchstaben angeben, da die Werte 'true/false' waren und nicht genau TRUE/FALSE. Anstelle von length sollte auch sum verwendet werden. Die sum erhält die Anzahl der TRUE-Elemente.

sum(df$Logical == "true") 
#[1] 2 

Wenn NA Elemente in der Spalte sind, verwenden na.rm = TRUE

sum(df$Logical=='true', na.rm = TRUE) 
#[1] 2 

Die length eines logischen oder einem anderen Vektor würde die gleiche wie die ursprüngliche Länge/Anzahl der Zeilen des Datensatzes sein.

length(df$Logical == "true") 
#[1] 6 

, weil es eine logische Vektor length 6.

df$Logical == "true" 
#[1] TRUE FALSE FALSE TRUE FALSE FALSE 

der Grafen von beiden true und false erhalten zurückgibt, können wir table

table(df$Logical) 
+0

ich eine Korrektur in meinem Eingangsdatenrahmen (df) hergestellt. Falls ich dort einen NA-Wert hinzugefügt habe, berechnet es auch mit NA. – martinkabe

+0

@martinbek Die 'NA' sollte ohne Anführungszeichen sein. – akrun

+0

Richtig, sorry - korrigiert – martinkabe

0

Vor allem „true verwenden "und" false ", wie Sie es in Ihren Datenrahmen schreiben, sind keine booleschen, sondern einfache Strings.

Darüber hinaus gibt length(df$Logical == TRUE) in diesem Beispiel immer 6 zurück, d. H. Die Anzahl der Elemente in der Spalte. Dies liegt daran, dass df$Logical == TRUE eine Sequenz von TRUE oder FALSE zurückgibt. In Ihrem Fall wird es zurückkehren

FALSE NA FALSE FALSE FALSE FALSE 

weil der boolesche Ausdruck nicht wahr ist. Die Länge wird jedoch 6 sein, wie von length() zurückgegeben.

das Problem überwinden Sie Ihre Datenrahmen wie diese

df <- data.frame("Logical"=c(TRUE,NA,FALSE,FALSE,NA,FALSE), 
     "Numeric"=c(1,2,3,4,5,6)) 

definieren könnte Und dann kann man die Anzahl der TRUE

sum(df$Logical == TRUE, na.rm = T) 
[1] 2 

na.rm = T ist wichtig, hier zusammenzufassen, da sonst die Summe zurück NA wenn eine mehr Elemente sind NA.

Alternativ können Sie auch mit Streichern arbeiten, um Sie richtig oder falsch (und leere Strings ein NA)

Dann schreiben könnte darauf hindeuten,

df <- data.frame("Logical"=c("true",NA,"false","true","","false"), 
      "Numeric"=c(1,2,3,4,5,6)) 

sum(df$Logical == "true", na.rm = T) 
[1] 2 
Verwandte Themen