避免grep中的部分匹配

时间:2014-08-30 14:09:02

标签: r

我想grep列名并保持完全匹配。我在避免部分匹配方面遇到了麻烦。这是一个更复杂的用例的简单示例。

keep <- c("A", "AA", "B")  # I get this dynamically in my actual use case
mydata <- data.frame(A=c(1, 1, 1),
                     AA=c(1, 1, 1),
                     B=c(1, 1, 1), 
                     BB=c(1, 1, 1),
                     C=c(1, 1, 1))

pattern <- paste(keep, collapse = "|")
mydata.subset <- mydata[grep(pattern, colnames(mydata), value=TRUE)]
names(mydata.subset)
# [1] "A"  "AA" "B"  "BB"

B位于keep,但不是BB。如何在不诉诸明确指定BB的方法的情况下排除BB等部分匹配?我只是要求grep()个例子犹豫不决,但我认为我需要这样做,因为我的实际案例更复杂,并且基于grep()解决方案。

也试过

mydata.subset <- mydata[grep(pattern, colnames(mydata), fixed=TRUE)]
names(mydata.subset)
# character(0)

2 个答案:

答案 0 :(得分:2)

您可以通过以下方式更改模式:

pattern <- paste0('^(',paste(keep, collapse = "|"),')$') # "^(A|AA|B)$"

其中^表示&#34;字符串&#34; 的开头,以及$ &#34;字符串的结尾&#34; < / em>的

无论如何,您可以使用%in%运算符更轻松地对data.frame进行子设置:

mydata.subset <- mydata[colnames(mydata) %in% keep]

甚至更简单(如果您对保持原始列顺序不感兴趣):

mydata.subset <- mydata[keep]

答案 1 :(得分:0)

一种方法是:

 indx <- grep(paste(paste0("\\b", keep, "\\b"),collapse="|"), colnames(mydata), value=TRUE)
  indx 
  #[1] "A"  "AA" "B" 
 mydata[indx]
 # A AA B
#1 1  1 1
#2 1  1 1
#3 1  1 1