使用grep函数子集化数据框会返回错误的结果

时间:2016-03-23 21:22:24

标签: r csv dataframe

我有以下csv文件:

"id";"left.text";"left.ord";"right.text";"right.ord"
"AAA";n/a;n/a;"";1
"BAA";"- left";1;"";2
"CAA";"- left";2;"";3
"DAA";"x left";3;"";4
"EAA";"x left";4;"";5
"FAA";"x left";5;"";6
"GAA";"x left";6;"";7
"HAA";"x left";7;"";8
"IAA";n/a;n/a;"x";9
"JAA";n/a;n/a;"x";10
"KAA";n/a;n/a;"x";11
"LAA";n/a;n/a;"-";12
"MAA";n/a;n/a;"-";13
"NAA";n/a;n/a;"-";14
"OAA";n/a;n/a;"-";15
"PAA";"x left";8;"";16
"QAA";"- left";9;"";17
"RAA";n/a;n/a;"-";18
"SAA";n/a;n/a;"-";19
"TAA";n/a;n/a;"-";20

通过

加载
dframe <- read.csv(file="input.csv", header=T, sep=";", skip=0, check.names=TRUE, na.string = "n/a")

以下命令按预期工作并返回一条记录(其中id为AAA):

res1 <- dframe[with(dframe, which(is.na(left.text) & right.text == "")), ]

但似乎这个完全忽略了&符后的部分并返回n/a列中的所有left.text记录:

res2 <- dframe[with(dframe, which(is.na(left.text) & grep("^[:blank:]*$", right.text))), ]

第二个命令不应该与第一个命令相同吗?

PS:因为n/a值被认为是在csv中明确标记为n/a的值,而不是那些空白的值。

1 个答案:

答案 0 :(得分:2)

根据要求发布回答。这里有几个问题:

  • grepl / grep as @fishtank说(grep返回数字索引,使用grepl,如果你想应用布尔运算,则返回逻辑)
  • [:blank:]''不匹配,它匹配“空格和制表符,可能还有其他与语言环境相关的字符,例如不间断的空格。”(请参阅{ {1}})
  • 无论如何你需要双方括号。示例:?regexp

底线:尝试使用grep进行子集化的观察行为与预期一致。坚持使用您的第一个公式,但您可以放弃grepl('^[[:blank:]]$', c(' ', ''))调用,因为逻辑向量与数值向量的子集一样好:

which