我在删除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列(预期)
有人可以帮我理解第一个陈述中的错误以及第二个陈述中的错误
答案 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的所有列,则应使用第一个语句。希望这会有所帮助。