我正在尝试删除数据框df
中的列,其中0和以下是我的语法。
df_new<-df[,which(colSums(df) !=0)]
我收到错误
colSums(df)出错:'x'必须是数字。
我做错了什么?
答案 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))]