目的:
我是R
的新手,但我正在努力熟悉R
中的编程。在当前任务中,我希望替换corpus
中出现的一些单词,同时保持corpus
的结构。
Gsub
不允许将矢量用于模式和相应的替换,因此我决定编写修改后的Gsub
函数。 (我知道Gsubfn
函数,但我也想开发一些编程技巧。)
数据生成
a<- c("this is a testOne","this is testTwo","this is testThree","this is testFour")
corpus<- Corpus(VectorSource(a))
pattern1<- c("testOne","testTwo","testThree")
replacement1<- c("gameOne","gameTwo","gameThree")
修改后的Gsub
gsub2<- function(myPattern, myReplacement, myCorpus, fixed=FALSE,ignore.case=FALSE){
for (i in 1:length(myCorpus)){
for (j in 1:length(myPattern)){
myCorpus[[i]]<- gsub(myPattern[j],myReplacement[j], myCorpus[[i]], fixed=TRUE)
}
}
}
代码执行
gsub2(pattern1,replacement1,corpus,fixed=TRUE)
但是,实际语料库中没有产生任何变化。我认为这是因为所有的变化都是在函数内部进行的,因此仅限于函数内部。然后我尝试返回语料库,但R
无法识别语料库对象。
有人能指出我正确的方向吗? 感谢。
答案 0 :(得分:3)
尝试使用mapply
:
# original data
corpus <- c("this is a testOne","this is testTwo","this is testThree","this is testFour")
# make a copy to gsub into
corpus2 <- corpus
# set pattern/replacement
pattern1<- c("testOne","testTwo","testThree")
replacement1<- c("gameOne","gameTwo","gameThree")
corpus2 # before gsub
# run gsub on all of the patterns/replacements
x <- mapply(FUN= function(...) {
corpus2 <<- gsub(...,x=corpus2)},
pattern=pattern1, replacement=replacement1)
rm(x) # discard x; it's empty
corpus2 # after gsub
答案 1 :(得分:2)
如果您已经建议退回corpus
对象
gsub2<- function(myPattern, myReplacement, myCorpus, fixed=FALSE,ignore.case=FALSE){
for (i in 1:length(myCorpus)){
for (j in 1:length(myPattern)){
myCorpus[[i]]<- gsub(myPattern[j],myReplacement[j], myCorpus[[i]], fixed=TRUE)
}
}
return(myCorpus)
}
然后
a <- gsub2(pattern1,replacement1,corpus,fixed=TRUE)
> class(a)
[1] "VCorpus" "Corpus" "list"
> for (i in 1:length(a)){print(a[[i]])}
this is a gameOne
this is gameTwo
this is gameThree
this is testFour
这不是你想要的吗?