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


96

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

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

我们想使用subset命令定义一个新的数据框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文件中提供,如何使该方法起作用?

Answers:


145

切勿使用=='NA'测试缺失值。使用is.na()代替。应该这样做:

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

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

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

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

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

用缺少的值替换它们。


2
感谢您的快速回答(很快)!实际上,由于数据的csv传递,因此'NA'是字符值,您的第二条语句可能非常有用。您还可以澄清您的第一句话吗?对于我来说,rowSums()的用法尚不清楚,因为我只会检查特定的列(有很多列)。如果该特定列(在示例中为Var2列)中有一个“ NA”字符串(我将用第二条语句替换它),那么我想选择整行作为新数据框的一部分。
约翰

@John:已更新。重点是使用is.na,我错误地解释了您想检查所有变量。
Joris Meys 2011年

3
应该是这样吗new_DF <- DF[is.na(DF$Var),],即(后面似乎有一个多余的括号DF[
PatrickT

39

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))

1
感谢您的回答。如果我理解正确,那么第一条语句与Joris示例中的Df [Df =='NA'] <-NA相同。(小的)区别是,在创建数据框时,它是在开始时直接在您的声明中完成的(这是一种非常干净的编程方法,因此,我喜欢它)。
约翰

究竟。Joris建议手动用NA值替换“ NA”字符串,这里我只建议使用read.table()的“ na.strings”功能来达到相同的目的。
maressyl 2011年

Joris的答案实际上是完成此壮举的“首选”方式(如果您是用脚本编写的)。请参阅:stackoverflow.com/questions/9860090/…–
乔纳森(Jonathan),

@Jonathan:这里有两个不同的想法,您引用的主题是“ [subset”,应该优先使用“ [”,但是我们在谈论read.table()中的“ na.strings”参数,我的子集在这里只是为了可视化效果。
maressyl

32

complete.cases给人TRUE当行中的所有值不NA

DF[!complete.cases(DF), ]

11
new_data <- data %>% filter_all(any_vars(is.na(.))) 

这将创建一个new_data仅包含缺失值的新数据框()。

最好跟踪那些以后可能会丢失的值,因为它们的某些列缺少观测值(NA)。


3

尝试更改此:

new_DF<-dplyr::filter(DF,is.na(Var2)) 

您能否解释一下为什么行得通,这行什么呢?
csilk

new_DF <-dplyr :: filter(DF,is.na(Var2)),它基本上使用dplyr包的过滤功能,并过滤出满足条件is.na的Var2列中的任何观测值,即他们用NA选择所有观测值
drhnis

1
更多好听表现为DF %>% filter(is.na(Var2))library(dplyr)

-1

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

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

@ZheyuanLi如果您不喜欢答案,只需对它投票。编辑建议标记的答案不是适当的操作。如果需要,请发表评论。
曼弗雷德·拉德维默
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.