2013-10-14 65 views
0

我的數據集中有兩個類似名稱的變量:「JE.Description」和「Field.Description」。我如何定位「JE.Description」列的列索引,以便從RegExp搜索中排除「字段」一詞?換句話說,我想修改下面的命令,只返回「JE.Description」的列索引:R中的正則表達式 - 排除關鍵字

數據集經常更新,有時候「JE.Description」字符串顯示爲「Description 」。這就是爲什麼我尋求明確排除關鍵字「字段」的解決方案。

r1 <- c(1:5) 
r2 <- c(1:5) 
df <- data.frame(r1,r2) 
names(df)[1] <- "JE.Description" 
names(df)[2] <- "Field.Description" 

y <- grep("!^Field^Description",perl = TRUE, colnames(df)) 
RETURNS: integer[0] 

謝謝,

+0

你能做出字符串一個簡單的例子應該和不應該匹配(也許你的一些colnames的)? – Frank

+2

它看起來像你的模式完全按照你想要的方式工作。 'x < - c(「Description」,「Field.Description」); grep(「^ Description $」,perl = TRUE,x)'result in'[1] 1' – ndoogan

+0

@ndoogan是的,你是對的。但我試圖找到一種方法來顯式排除正則表達式搜索中的「字段」。有時數據集顯示「說明」(在這種情況下,有問題的命令有效),而其他時間則顯示「JE.Description」。謝謝你的幫助。 – AME

回答

4

向含有"Description"每個字符串匹配除了爲那些其中它立即被"Field."之前,使用負向後斷言:

## The regex pattern 
pat <- "(?<!Field\\.)Description" 

## Try it out 
x <- c("Description", "Field.Description", "FieldDescription", "xyz Description") 
grep(pat, x, perl=TRUE) # Note: lookahead & lookbehind assertions need perl=TRUE 
# [1] 1 3 4 

可選地,如果子字符"field"可能會出現在相對於"Description"的某個其他位置(可能是大寫或小寫版本)可能是簡單的,只是grepl()兩次,並使用布爾運算符的結果結合起來:

x <- c("Description", "fieldDescription", "Field-of-Description", 
     "Description field") 
which(grepl("Description", x) & !grepl("field", x, ignore.case=TRUE)) 
[1] 1 
+0

+1!我想知道你爲什麼刪除了你的答案! – agstudy

+0

@agstudy - 只有B/C,在最初發布之後,我重讀了這個問題,並且看到它的表面看起來正在尋求不同的東西。 (現在,經過多次編輯後,我發現我原來的猜測可能是正確的......而剛纔,它已經被OP確認。) –

0
mydata<-structure(list(Description = c(21, 21, 22.8, 21.4, 18.7, 18.1, 
14.3, 24.4, 22.8, 19.2), Field.Description = c(6, 6, 4, 6, 8, 
6, 8, 4, 4, 6)), .Names = c("Description", "Field.Description" 
), row.names = c("Mazda RX4", "Mazda RX4 Wag", "Datsun 710", 
"Hornet 4 Drive", "Hornet Sportabout", "Valiant", "Duster 360", 
"Merc 240D", "Merc 230", "Merc 280"), class = "data.frame") 

mydata[grep("^Description",names(mydata))] 
        Description 
Mazda RX4    21.0 
Mazda RX4 Wag   21.0 
Datsun 710    22.8 
Hornet 4 Drive   21.4 
Hornet Sportabout  18.7 
Valiant     18.1 
Duster 360    14.3 
Merc 240D    24.4 
Merc 230     22.8 
Merc 280     19.2