2017-12-01 10 views
1

私はそれに文字列を持つデータフレームを持っています。私は、部分文字列が各要素内にあるかどうかを調べたいと思います。出力として、部分文字列が見つからない各要素に対してNAを持つデータフレーム(最終的には同じ)と、見つかった場合は実際の部分文字列(唯一!)が必要です。部分文字列自体を検索して返します

さらに、私は複数の部分文字列を持っています...そして、私はそれらの部分文字列の2つが決して同じ要素にないことを知っています!

私はそれに着い最も近いだった:

for(i in 1:length(partial_strings)){ 
    z <- apply(y,2,function(k)str_replace(k,partial_strings[i], partial_strings[i])) 
} 
z <- ifelse(z %in% partial_strings,z,NA) 

しかし残念ながら、代わりに部分的にしか文字列を返すのstr_replaceは、それが元の要素を返しています。理由を理解することができますが、私が望むところから出力をさらに進化させる他のことを試みました。 stringrパッケージに予め

+0

サンプルデータセットをご提供ください。これは一般的に 'grepl'コマンドで行うことができます。 unit-case文は、 'df $ column [!grepl( 'partial string'、df $ column)] = NA'の行に沿ったものです。 – Kamil

+0

正しく理解すれば、文字ベクトルがあります: ' StringVector < - c( "Week39"、 "Week40"、 "Wk41"、 "number50"、 "nbr51"、 "Wk44") ' そして、上記のベクトルから識別する部分文字列またはパターンを"Week"と "Wk"; 'patterns < - c(" Week "、" Wk ") grepl(paste(patterns、collapse =" | ")、StringVector)';あなたの部分文字列が何であるかに依存して、上記のようにapply関数内でifelse()を設計することができます。 – lemonC

答えて

0

str_extract

おかげで移動するための方法です。必要に応じて正規表現を使用します。これは抽出する部分文字列が複数ある場合に便利です。

角括弧内の部分文字列をそれぞれ"|"で区切って作成します。例えば、textと呼ばれる文字ベクトルから​​または"def"のいずれかを抽出する:

str_extract(text, "(abc|def)") 

もし戻っ​​を含むtext、およびそれらが一致しているところはどこでも"def"と同じ長さの文字列のベクトル。 1つの文字列が両方の部分文字列に一致する場合は、最初に返された文字列のみが返されます(たとえば、str_extract("abcghdbdef", "(abc|def)")は​​を返します)。部分一致がない場合はNAを返します。

関連する問題