107

我们有一个来自 CSV 文件的数据框。数据框DF具有包含观察值的列和VaR2包含进行测量的日期的列 ( )。如果未记录日期,则 CSV 文件包含NA缺失数据的 , 值。

Var1  Var2 
10   2010/01/01
20   NA
30   2010/03/01

我们想使用子集命令来定义一个新的数据框new_DF,使其仅包含具有NA'列 ( VaR2) 中的值的行。在给出的示例中,只有第 2 行将包含在新的DF.

命令

new_DF<-subset(DF,DF$Var2=="NA") 

不起作用,生成的数据框没有行条目。

如果在原始 CSV 文件中与NA交换 值NULL,则相同的命令会产生所需的结果:new_DF<-subset(DF,DF$Var2=="NULL")

NA如果原始 CSV 文件中提供了字符串的值,我如何才能使此方法起作用?

4

6 回答 6

168

永远不要使用 =='NA' 来测试缺失值。改为使用is.na()。这应该这样做:

new_DF <- DF[rowSums(is.na(DF)) > 0,]

或者如果您想检查特定列,您也可以使用

new_DF <- DF[is.na(DF$Var),]

如果您有 NA 字符值,请先运行

Df[Df=='NA'] <- NA

用缺失值替换它们。

于 2011-11-02T13:02:39.233 回答
46

complete.casesTRUE当一行中的所有值都不是时给出NA

DF[!complete.cases(DF), ]
于 2017-11-03T09:35:54.837 回答
40

NA 是 R 中的一个特殊值,不要将 NA 值与“NA”字符串混淆。根据导入数据的方式,您的“NA”和“NULL”单元格可能是各种类型(默认行为是将“NA”字符串转换为 NA 值,并让“NULL”字符串保持原样)。

如果使用 read.table() 或 read.csv(),您应该考虑使用“na.strings”参数进行干净的数据导入,并始终使用真实的 R NA 值。

一个示例,在“NULL”和“NA”单元格两种情况下工作:

DF <- read.csv("file.csv", na.strings=c("NA", "NULL"))
new_DF <- subset(DF, is.na(DF$Var2))
于 2011-11-02T13:32:52.453 回答
17
new_data <- data %>% filter_all(any_vars(is.na(.))) 

这应该会创建一个新的数据框 ( new_data),其中仅包含缺失值。

最好跟踪您以后可能删除的值,因为它们有一些缺少观察值 (NA) 的列。

于 2018-07-27T12:01:42.750 回答
4

尝试改变这个:

new_DF<-dplyr::filter(DF,is.na(Var2)) 
于 2017-11-21T23:57:28.780 回答
-1

打印所有带有 NA 数据的行:

tmp <- data.frame(c(1,2,3),c(4,NA,5));
tmp[round(which(is.na(tmp))/ncol(tmp)),]
于 2016-05-29T06:28:36.233 回答