对于NA或“”条目,grep行为是奇数

时间:2012-11-20 00:26:09

标签: r

我对R很新,我正在使用带有空条目的向量,并注意到grep与我的数据反直觉。我只是想用一个例子,因为我不是100%肯定如何解释它。说我有三个向量:

A<-c("","","","","","","a")
B<-c(NA,NA,NA,NA,NA,NA,"a")

A是最初存储数据的方式,B是R读取数据的方式。运行> vec[grep("",vec, invert=TRUE)] - 我的理解 - 搜索vec所有空单元格,返回它们的索引,然后填充并显示带有非空数据条目的结果向量。但是当我为vec=Avec=B运行时,我得到:

vec = A:

> A[grep("",A, invert=FALSE)]
[1] "" "" "" "" "" "" "" "a" 
> A[grep("",A, invert=TRUE)]
character(0)

vec = B:

> B[grep("",B, invert=FALSE)]
[1] "a"
> B[grep("",B, invert=TRUE)]
[1] NA NA NA NA NA NA

由于我认为我的数据被读取就像案例B一样,我被反直觉的结果所困扰。我意识到这可能只是一个变量型问题,但我想知道是否有人可以更清楚了解情况如何发生。

快速编辑案例A是有道理的:因为grep无法找到“”,因为变量类型已关闭,它会返回所有内容。反转,它返回字符(0)作为“无”的默认值。案件B仍然感到困惑。

2 个答案:

答案 0 :(得分:7)

请注意,grep执行正则表达式搜索(不是字符串匹配)。

您输入的正则表达式""为空,因此运行grep会询问与匹配的任何字符串是否包含 "",而不是字符串是否完全匹配“”。

例如,

grepl("a","bananas")

返回TRUE,因为“a”在“香蕉”中是

如果要将整个字符串""匹配,可以在正则表达式中使用“^”和“$”('^'表示字符串的开头,'$'表示字符串的结尾):

grepl("^$", "") # returns TRUE
grepl("^$", "a") # returns FALSE

然而,如果它只是你想要的空单元格,你最好不要使用正则表达式:

A[A != ""] # returns "a"
B[!is.na(B)] # returns "a"

答案 1 :(得分:3)

关于你的第一个问题:

> A[grep("^$", A)]
[1] "" "" "" "" "" ""
> A[grep("^$", A, invert=TRUE)]
[1] "a"

您使用""作为模式正在拾取任何字符元素。 "^$"的使用正在拾取开头和结尾之间没有字符的字符元素的位置。

正如NA没有"=="任何事情(甚至是自身),所以NA不匹配""