2015-12-23 36 views
1

我的数据是这样的导入后R:在数据帧行的选择包括NA

A = data.frame(ID= c(1,2,3,4,5,6), Name = c(NA,"A",NA,NA,NA,"B")) 

>A 
ID Name 
1 <NA> 
2 A 
3 <NA> 
4 <NA> 
5 <NA> 
6 B 

我想到这个结果,当我选择与名称==“A”的所有行:

ID Name 
2 2 A 

不过,我得到5行:

> A[A$Name=="A",] 
    ID Name 
NA NA <NA> 
2  2 A 
NA.1 NA <NA> 
NA.2 NA <NA> 
NA.3 NA <NA> 

请注意,我不找complete.cases()因为有数据帧更多的列。我也在read.csv(...,na.strings = NA)中指定了na.strings参数。缺少的值不是“NA”,但csv文件中的NA并且在导入过程中与其一起玩并没有改变任何东西。

回答

5

要查看您所需要的结果,试试这个:

> subset(A,Name=="A") 
    ID Name 
2 2 A 
4

试试这个:

> A[which(A$Name=="A"), ] 
    ID Name 
2 2 A 
1

R.

的是,这显然是期望的行为尝试

A = data.frame(ID= c(1,2,3,4,5,6), Name = c(NA,"A",NA,NA,NA,"B")) 

A[A$Name=="A" & !is.na(A$Name),] 
    ID Name 
2 2 A 

这是因为将NA与值等于NA,而不是TRUE或FALSE

"B" == "A" 
[1] FALSE 
"A" == "A" 
[1] TRUE 
NA == "A" 
[1] NA 
2

您还可以使用%in%代替==:转换为data.table

A[A$Name %in% "A", ] 
# ID Name 
#2 2 A 
1

这里是一个方式,通过设置“名称”作为键列。

library(data.table) 
setDT(A, key='Name')['A'] 
# ID Name 
#1: 2 A