我想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)
答案 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