2017-06-22 60 views
0

我想刪除數據框中的列df其中0和以下是我的語法。刪除有0的列

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

我得到一個錯誤

錯誤colSums(DF): 'X' 必須是數字。

我在做什麼錯?

+0

在你的'df'有一些列不屬於數字。你需要在應用'colSums'之前刪除它們。要檢查'df'中的列的類,請執行'str(df)'並忽略本質上不是數字的列。 –

回答

1

這應該工作

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

編輯

上面的代碼自然應該對所有數字列工作,但什麼因素列或字符列用「0」,這樣做,我們有相同的預期的行爲?我們可以做一些測試:

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 

會發生什麼事是R轉換的RHS 0(數字)爲"0"(人物),也是因素列在LHS成字符。所以,如果你真的想刪除任何列爲「0」的列,那麼代碼通常應該可以正常工作,不管它是數字還是字符。但是,如果目的是要始終保持字符或因素柱,然後某事像這樣可能有助於

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

也許:你有一個因子列 –

+0

@ 42-謝謝指出!請參閱更新。 – platypus