4

我对 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

因为我认为我的数据被读取就像案例 BI 被反直觉的结果难住了。我意识到这可能只是一个变量类型的问题,但是我想知道是否有人可以对正在发生的事情有更多的了解。

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

4

2 回答 2

8

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

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

例如,

grepl("a","bananas")

返回TRUE是因为“a”“bananas”中。

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

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

但是,如果您想要的只是空单元格,那么您最好不要使用正则表达式:

A[A != ""] # returns "a"
B[!is.na(B)] # returns "a"
于 2012-11-20T00:34:14.227 回答
3

对于你的第一个问题:

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

""用作模式的用途是拾取任何字符元素。的用途"^$"是拾取开始和结束之间没有字符的字符元素的位置。

就像 NA什么都不做"=="(甚至它自己)一样,所以 NA not match 也是如此""

于 2012-11-20T00:32:16.307 回答