已经纠结了一段时间了
我有一个具有两列的数据集,一个描述列和另一个是我试图与描述列匹配的模式列。如果Description列中存在对应的模式,则需要用星号
替换。例如,如果Description是ABCDEisthedescription, Pattern是ABCDE,那么新的Description应该是*isthedescription
我尝试了以下方法data$NewDescription <- gsub(data$pattern,"\*",Data$Description )
因为数据集中有多行,它抛出一个错误(而不是一个警告)"参数'pattern'的长度> 1,并且只使用第一个元素"
任何帮助都将非常感激。
您可以在这里使用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"
另外,
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的方法似乎更简洁。