我对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=A
和vec=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仍然感到困惑。
答案 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不匹配""
。