在数据框架的选定列中包含 NA (缺失)值的行的子集

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

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

我们希望使用子集命令来定义一个新的数据帧 new_DF,以便它只包含来自列(VaR2)的具有 NA'值的行。在给出的示例中,新的 DF中只包含第2行。

命令

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

如果不工作,则生成的数据帧没有行条目。

如果在原始的 CSV 文件中,将 Value NANULL交换,则相同的命令将产生所需的结果:

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

如果在原始 CSV 文件中为字符串提供了值 NA,那么如何使这个方法工作呢?

391755 次浏览

不要使用 = = ‘ NA’来测试缺少的值。使用 is.na()代替。应该这样做:

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

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

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

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

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

用缺失的值替换它们。

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

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

例如,在“ NULL”和“ NA”单元格两种情况下都可以使用:

DF <- read.csv("file.csv", na.strings=c("NA", "NULL"))
new_DF <- subset(DF, is.na(DF$Var2))

用 NA 数据打印所有行:

tmp <- data.frame(c(1,2,3),c(4,NA,5));
tmp[round(which(is.na(tmp))/ncol(tmp)),]

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

DF[!complete.cases(DF), ]

试着改变这一点:

new_DF<-dplyr::filter(DF,is.na(Var2))
new_data <- data %>% filter_all(any_vars(is.na(.)))

这将创建一个新的数据帧(new_data) ,其中只包含缺失的值。

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

Since dplyrs filter_all has been superseded

限定范围的动词(_ if,_ at,_ all)已被现有动词中的 across()所取代。

而且 across()filter()中的使用是不被推荐的,Ronak Pol 的回答需要一个小的更新。要在任何地方找到具有 NA的所有行,我们可以使用

library(dplyr)


DF %>%
filter(if_any(everything(), is.na))

得到

# A tibble: 1 x 2
Var1 Var2
<dbl> <date>
1    20 NA