2016-04-19 6 views
2

*を含まないすべての値をNAに置き換える正規表現を作成しようとしています。誰かがRスタイル(PCRE?)の正規表現でエスケープ文字を正しく否定する方法を説明できますか?あなたが全体を交換する必要がありながらRスタイルの正規表現で一致するエスケープ文字

temp<-data.frame(c("hi","keep**",NA),c("keep***",NA,"xxx")) 
lapply(temp,function(x){gsub("[^\\*]",NA,x)}) #This did not work like I thought it would 

GOAL

NA keep*** 
keep* NA 
NA NA 
+0

に動作しますが、アスタリスクは、常にワードの終わりになりますか? – excaza

+0

おそらく、 'lapply(temp、function(x){gsub("^[^ *] * $ "、NA、x)})'? –

+0

@WiktorStribiżewそれは私が必要としていたものでした。あなたはそれを答えとして提示し、なぜ^を2回使ったのか説明しますか? – Rilcon42

答えて

2

主な問題は、あなたが[^\\*]とアスタリスクではないだけで1文字にマッチし、gsubを使用してNAと交換されていることであると思われます値(=文字列)。

使用^[^*]*$

  • ^ - 文字列
  • [^*]*の開始 - *ではありません(これは最後に*数量詞に)一致0+文字([^...]が、その否定文字クラスでありますクラス内で定義されているもの以外のすべての文字と一致します)
  • $ - 文字列の最後。

正規表現がperl=Tなしgsubで使用されているので、あなたは文字クラス内でエスケープ文字を使用することはできません、それは(POSIX由来)TRE正規表現の風味によって禁じられています。

1

character-class演算子は、最初の文字 "^"を作るときに否定を許しますが、 "裸の" NAは文字値ではないので十分ではありません。文字クラスシーケンス内で特殊な文字のほとんどをエスケープする必要はありません。条件付きで選択したアイテムをNAにするには、別の戦略が必要です。 1つの事のためにあなたは偽装された要因を混乱させる。私はifelseが良い戦略だと思った。 Rは自動的に文字の値を混乱の原因となる要因にします。使用stringsAsFactors = FALSEまたはlapply(dfrm, as.character)避けるために、または修正:

> temp<-data.frame(a=c("hi","keep**",NA),b=c("keep***",NA,"xxx"), stringsAsFactors=FALSE) 
> lapply(temp,function(x){ifelse(!grepl("[*]",x) , NA, x)}) 
$a 
[1] NA  "keep**" NA  

$b 
[1] "keep***" NA  NA  
0

ない最高のが、これはまた

temp<-data.frame(c("hi","keep**",NA),c("keep***",NA,"xxx")) 
lapply(temp,function(x){gsub("(?!.*\\*)(\\w+)", NA, x, perl=T)}) 
関連する問題