R:数据框中的行选择包括 NA
R: Selection of rows in data frame includes 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
我期待这个结果,当我 select Name=="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 并且在导入过程中使用它并没有改变任何东西。
试试这个:
> A[which(A$Name=="A"), ]
ID Name
2 2 A
要查看您需要的结果,试试这个:
> subset(A,Name=="A")
ID Name
2 2 A
是的,这显然是 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
您也可以使用 %in%
代替 ==
:
A[A$Name %in% "A", ]
# ID Name
#2 2 A
这里有一种方法,将'Name'转换为data.table
后设置为key列。
library(data.table)
setDT(A, key='Name')['A']
# ID Name
#1: 2 A
导入后我的数据是这样的
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
我期待这个结果,当我 select Name=="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 并且在导入过程中使用它并没有改变任何东西。
试试这个:
> A[which(A$Name=="A"), ]
ID Name
2 2 A
要查看您需要的结果,试试这个:
> subset(A,Name=="A")
ID Name
2 2 A
是的,这显然是 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
您也可以使用 %in%
代替 ==
:
A[A$Name %in% "A", ]
# ID Name
#2 2 A
这里有一种方法,将'Name'转换为data.table
后设置为key列。
library(data.table)
setDT(A, key='Name')['A']
# ID Name
#1: 2 A