删除具有0的列

时间:2017-06-22 03:00:50

标签: r

我正在尝试删除数据框df中的列,其中0和以下是我的语法。

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

我收到错误

  

colSums(df)出错:'x'必须是数字。

我做错了什么?

1 个答案:

答案 0 :(得分: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))]