数据集中的模式匹配

时间:2014-07-13 17:50:09

标签: regex r gsub

已经挣扎了一段时间。

我有一个包含两列的数据集,一个Description列,另一个是我尝试与描述列匹配的模式列。如果Description列中存在相应的模式,则需要用星号替换它

例如,如果说明是ABCDEisthedescription且模式是ABCDE,那么新描述应该是*是描述

我尝试了以下内容     data$NewDescription <- gsub(data$pattern,"\\*",Data$Description )

因为数据集中有多行,所以会抛出错误(相反警告)  &#34;论证&#39;模式&#39;长度> 1,只使用第一个元素&#34;

任何帮助都将非常感激。

2 个答案:

答案 0 :(得分:0)

您可以在此处使用mapply将该功能应用于每一行。

#sample data
data<-data.frame(
    pattern=c("ABCDE","XYZ"), 
    Description=c("ABCDEisthedescription", "sillyXYZvalue")
)

现在使用mapply

mapply(function(p,d) gsub(p, "\\*", d, fixed=T), data$pattern, data$Description)
# [1] "\\*isthedescription" "silly\\*value" 

答案 1 :(得分:0)

此外,

Patterns <- paste0(
  sample(LETTERS[1:4],500,replace=TRUE),
  sample(LETTERS[1:4],500,replace=TRUE),
  sample(LETTERS[1:4],500,replace=TRUE),
  sample(LETTERS[1:4],500,replace=TRUE))
##
Desc <- paste0(Patterns,"isthedescription")
Ptrn <- sample(Patterns,500)
##
Data <- data.frame(
  Description=Desc,
  Pattern=Ptrn,
  stringsAsFactors=FALSE)
##
newDesc <- sapply(1:nrow(Data), function(X){
  if(substr(Data$Description[X],1,4)==Data$Pattern[X]){
    gsub(Data$Pattern[X],"*",Data$Description[X])
  } else {
    Data$Description[X]
  }
})

@ MrFlick的方法似乎更简洁。