2017-06-22 5 views
0

Ich versuche, Spalten in einem Datenrahmen df, die 0 und darunter ist meine Syntax zu entfernen.Löschen von Spalten mit 0

df_new<-df[,which(colSums(df) !=0)] 

ich einen Fehler als

bin immer

Fehler in colSums (df): 'x' muss numerisch sein.

Was mache ich falsch?

+0

In Ihrem 'df' gibt es einige Spalten, die nicht numerisch sind. Sie müssen sie entfernen, bevor Sie 'colSums' anwenden. Um die Klasse der Spalten in Ihrem 'df' zu überprüfen, tun Sie' str (df) 'und ignorieren Sie die Spalten, die nicht numerischer Natur sind. –

Antwort

1

sollten Diese

arbeiten
df[,sapply(df,function(V) sum(V==0)==0)] 

EDIT

Der obige Code natürlich für alle numerischen Spalten funktionieren sollte, aber was Faktor Spalten oder Zeichenspalten mit „0“ ist, wir haben die gleiche erwartetes Verhalten? Wir können ein paar Tests durchführen:

factor(letters[1:5]) == 0 
# FALSE FALSE FALSE FALSE FALSE 

factor(c(0:5)) == 0 
# TRUE FALSE FALSE FALSE FALSE FALSE 
as.character(c(0:5)) == 0 
# TRUE FALSE FALSE FALSE FALSE FALSE 

c(0,letters[1:5]) == 0 
# TRUE FALSE FALSE FALSE FALSE FALSE 
factor(c(0,letters[1:5])) == 0 
# TRUE FALSE FALSE FALSE FALSE FALSE 

Was passiert ist, dass R 0 (numerisch) auf der RHS in "0" (Zeichen) und auch den Faktor Spalte auf der LHS in Zeichen umwandeln. Daher sollte der Code im Allgemeinen gut funktionieren, wenn Sie wirklich jede Spalte mit "0" entfernen wollen, egal, ob es sich um eine Zahl oder ein Zeichen handelt. Aber wenn die Absicht ist, immer die Zeichen- oder Faktorspalte beizubehalten, dann könnte etw so etwas helfen:

df[,sapply(df,function(V) sum(V==0)==0 | is.character(V) | is.factor(V))] 
+0

Vielleicht: Sie haben eine Faktor Spalte –

+0

@ 42- Danke für das Aufzeigen! Bitte siehe aktualisiert. – platypus

Verwandte Themen