删除R中的所有NA值列时得到错误的结果

时间:2017-07-30 08:38:10

标签: r dataframe

我在删除R

中的所有NA值列时得到了错误的结果

数据文件:https://d396qusza40orc.cloudfront.net/predmachlearn/pml-training.csv

trainingData <- read.csv("D:\\pml-training.csv",na.strings = c("NA","", "#DIV/0!"))

现在我要删除所有只有NA的

的列

方法1:这里我的意思是读取所有超过0总和而不是NA的列

aa <- trainingData[colSums(!is.na(trainingData)) > 0]
length(colnames(aa)) 

154列

方法2:根据此查询,它将给出NA和sum = 0的所有列,但是它给出了没有NA并给出预期结果的列的结果

bb <- trainingData[,colSums(is.na(trainingData)) == 0]
length(colnames(bb)) 

60列(预期)

有人可以帮我理解第一个陈述中的错误以及第二个陈述中的错误

1 个答案:

答案 0 :(得分:1)

aa <- trainingData[,colSums(!is.na(trainingData)) > 0]
length(colnames(aa)) 

您将数据框转换为带有!is.na(trainingData)的布尔数据框,并查找列中存在多个TRUE(非NA)的所有列。因此,这将返回至少具有一个非NA值的所有列,这些值似乎只有6列。

bb <- trainingData[colSums(is.na(trainingData)) == 0]
length(colnames(bb)) 

使用is.na(trainingData)将数据帧转换为布尔值,并返回列中没有TRUE(无NA)的所有值。这将返回没有缺失值的所有列(即没有NA&#39;)。

评论中要求的示例:

df  = data.frame(a=c(1,2,3),b=c(NA,1,1),c=c(NA,NA,NA))
bb <- df[colSums(is.na(df)) == 0]

> df
  a  b  c
1 1 NA NA
2 2  1 NA
3 3  1 NA
> bb
  a
1 1
2 2
3 3

所以这些陈述实际上是不同的。如果要删除仅为NA的所有列,则应使用第一个语句。希望这会有所帮助。