2016-11-18 11 views
0

の2つの文字列の間に一致する文字の数値を持つデータフレーム内にユニークな列を作成しようとしています。両方の文字列の左側にがあります。行単位の部分文字列一致

各行は、ユーザーが指定した文字列に対してテストとして使用する比較文字列を表します。 xは、私たちの比較文字列とyは私たちの与えられた文字列である、私は列Zに「2、3、0」出力の値を持っているよ

df <- data.frame(x=c("yhf", "rnmqjk", "wok"), y=c("yh", "rnmj", "ok")) 

     x y 
1 yhf yh 
2 rnmqjk rnmj 
3 wok ok 

、そのような::。

データフレームを考えます
 x y z 
1 yhf yh 2 
2 rnmqjk rnmj 3 
3 wok ok 0 

私は、指定された文字列(y)を比較文字列(x)に対して左から右にチェックしたいと考えています。文字が並んでいない場合は、文字列を入力して一致番号を記録します。

ありがとうございます!

答えて

0

このコードはあなたの例のために働く:

df$z <- mapply(function(x, y) which.max(x != y), 
       strsplit(as.character(df$x), split=""), 
       strsplit(as.character(df$y), split="")) - 1 

df 
     x y z 
1 yhf yh 2 
2 rnmqjk rnmj 3 
3 wok ok 0 

文字ベクトルのリストに文字列ベクトルを分割strsplitアウトラインとして。ここでは、ベクトルの各要素は1つの文字(split = ""引数)です。 which.max関数は、その引数がベクトルの最大値である最初の位置を返します。返されるベクトルはx != yで論理的なので、which.maxは差が観測される最初の位置を返します。 mapplyは関数を受け取り、指定された関数をリストの対応する要素にリストして適用します。

これは、文字列の長さが一致しないことを警告します。これはいくつかの方法で対処できます。最も簡単なのは、メッセージにバグがある場合はsuppressWarningsに関数をラップします。


単語全体がwhich.max戻っ1.文字列と同じ長さを返すには、その後、一致するインスタンスがある場合はOPノートはコメントをintとして、私は論理的な組み合わせコードの2行を追加したいですnchar関数でサブセット化する:

df$z[as.character(df$x) == as.character(df$y)] <- 
         nchar(as.character(df$x[as.character(df$x) == as.character(df$y)])) 
+0

こんにちは、私にそれを助けてくれてありがとう。文字列が完全に一致すると、作成した関数は "0"を返します(x!= yのインスタンスがないため)。 x = yのときに比較文字列の文字列長を返すようにコードを修正する方法について提案はありますか? –

関連する問題