2017-08-03 13 views
4

データフレーム(data.table)の列に格納されているアドレスにベクトルに格納されている文字列を一致させるには、何か助けが必要です。私のデータベースは約100万レコードに相当するため、data.tableの方が好きです。以下は変数内の文字列を検索し、一致する文字列を返す

は、データとベクトルのダミーサンプルです -

my <- data.frame(add=c("50, nutan nagar Mum41","50, nutan Mum88 Maha","77, amar nagar Blr79 Bang","54, veer build Chennai3242","amar 755 Blr 400018")) 

vec1 <- c("Mum","Blr","Chennai") 

私は私の変数を追加で各アドレスにVEC1内の文字列ごとに検索する必要があります。変数がvec1の文字列をアドレスで見つけた場合は、一致する文字列を新しい列の結果に戻す必要があります。複数の一致の場合、最初の一致した値、つまりIncaseは "Mum"と "Blr"を両方とも1つのアドレスに "Mum"を返します。

ダミーデータに基づいて、期待される結果は次のようになります -

my$result <- c("Mum","Mum","Blr","Chennai","Blr") 

私はgrepを/ greplを使用してみましたが、彼らは、エラー「引数 『パターン』は長さ> 1のみ最初の要素が使用されます持っ与えます"

私はstr_matchを使ってみましたが、値自体ではなくアドレスにあるベクトルの各文字列に対してTRUE/FALSEを得ました。

これをどのように達成できますか?

答えて

5

我々はstr_extract

library(stringr) 
str_extract(my$add, paste(vec1, collapse="|")) 
#[1] "Mum"  "Mum"  "Blr"  "Chennai" "Blr" 

それともbase R

regmatches(my$add, regexpr(paste(vec1, collapse="|"), my$add)) 
#[1] "Mum"  "Mum"  "Blr"  "Chennai" "Blr"  
+2

私の解決策よりもはるかにクリーンで、それらの機能を認識していませんでした。私を紹介してくれてありがとう;) – Florian

+1

@akrun、great !!ありがとうございました!!あなたはそれをとてもシンプルにしました。 – user1412

+0

@akrun、このソリューションはダミーデータを処理しますが、実際のデータは処理していません。変数の型をチェックして文字に変換したり、クラスを変更したりしましたが、まだベクトルからテキストを見つけることはできません。私の実際のデータ・テキストはすべて韓国語の文字ですが、それは問題でしょうか?どうやって終わりますか?私は昨夜以来努力してきましたが、運がありません。両方の方法を試みた。提案してください!! – user1412

3

ベースRと可能な解決策:

vec1[sapply(as.data.frame(do.call(rbind,lapply(vec1, 
     function(x) {grepl(x,my$add)}))), function(y) {min(which(y))})] 

リターン:

[1] "Mum"  "Mum"  "Blr"  "Chennai" "Blr" 

は、この情報がお役に立てば幸い!

+0

とを使用することができますあなたの答えをありがとう!私は適用する家族機能についてもっと理解する必要があります。 – user1412

+0

私の実際の1mレコードのデータにこのコードを実装しようとすると、エラーが発生します。間違っている? – user1412

関連する問題