No.22662 【R】 文字列の部分的マッチング charmatch  【明石】 2019/01/02(Wed) 15:18

青木先生 様;

お忙しいところを失礼いたします,明石と申します。
新年明けましておめでとうございます。
毎々,ご丁寧なご教示をいただき,誠にありがとうございます。
改めて,御礼を申し上げます。

青木先生にご教示いただきたいことが出てきました。
何卒どうぞよろしくお願いいたします。

--------------------------------------------------

文字列の部分的マッチング charmatch
http://www.okadajp.org/RWiki/?R%E3%81%AE%E6%96%87%E5%AD%97%E5%88%97%E5%87%A6%E7%90%86%E9%96%A2%E6%95%B0#b71cbd6d

以下の例題が示されています。
複数の場合は「0」を返すということも確認しました。
> charmatch("me", c("mean", "median", "mode"))
[1] 0

> charmatch("med", c("mean", "median", "mode"))
[1] 2
この2つを組み合わせて,以下も確認できました。
> charmatch(c("me","med"), c("mean", "median", "mode")) 
[1] 0 2
さて,以下の例題を考えます。
v <- c("aa", "bb", "ab", "ba", "abab", "abba", "baba", "baab")
s1 <- c("aa","bb")
s2 <- c("ba","ab")

charmatch(s1, v)
charmatch(s2, v)

> charmatch(s1, v)
[1] 1 2
> charmatch(s2, v)
[1] 4 3
複数の場合は「0」を返すという理解ですので,なぜ,「0」にならないのか,分かりません。
ご教示いただけましたら助かります。

新年早々,お手数をおかけいたします。
何卒どうぞ,よろしくお願いいたします。

No.22663 Re: 【R】 文字列の部分的マッチング charmatch  【青木繁伸】 2019/01/03(Thu) 15:08

一番最初の定義があるからでは?

> 正確なマッチが一部だけのマッチより優先される(つまり,ターゲットの先頭部分に 値が正確にマッチし,更にターゲットのほうがより長いケース)。
> charmatch(c("aa","bb"), c("aa", "aa", "bb", "ab", "ba", "abab", "abba", "baba", "baab")
+ )
[1] 0 3
> charmatch(c("aa","bb"), c("aa", "aas", "bb", "ab", "ba", "abab", "abba", "baba", "baab"))
[1] 1 3
> charmatch(c("aa","bb"), c("aaw", "aas", "bb", "ab", "ba", "abab", "abba", "baba", "baab"))
[1] 0 3

No.22664 Re: 【R】 文字列の部分的マッチング charmatch  【明石】 2019/01/03(Thu) 16:24

青木先生 様;

お忙しいところを失礼いたします,明石と申します。
新年明けましておめでとうございます。

青木先生がご指摘してくださいました箇所
> 正確なマッチが一部だけのマッチより優先される
> (つまり,ターゲットの先頭部分に 値が正確にマッチし,更にターゲットのほうがより長いケース)。

の意味を完全に理解できないでおりました。
大変に失礼いたしました。

---------------------------------------
青木先生,追加のご質問がございます。
何卒どうぞよろしくお願いいたします
> s <- c("aa", "aa", "bb", "ab", "ba", "abab", "abba", "baba", "baab")
> v <- c("aa", "bb", "ab", "ba")
>
> grep(v[1], s)
[1] 1 2 9
> grep(v[2], s)
[1] 3 7
> grep(v[3], s)
[1] 4 6 7 8 9
> grep(v[4], s)
[1] 5 6 7 8 9
sを対象として,ベクトルvを,grep()関数で部分一致照合させた添字番号を取得したい
と思っていますが,
grep()関数では,第一引数は単体で与える必要があることから,
上記のように,vの要素ごとにgrep()関数を呼ぶことになります。

ベクトル v と s を与えて,上記の結果(4本のベクトル)をリストで得る
Rプログラムをご教示いただければ大変に勉強になります。

新年早々,お手数をおかけいたします。
何卒どうぞよろしくお願いいたします。

No.22665 Re: 【R】 文字列の部分的マッチング charmatch  【青木繁伸】 2019/01/03(Thu) 18:32

sapply(v, grep, s) または lapply(v, grep, s) でできます
> s <- c("aa", "aa", "bb", "ab", "ba", "abab", "abba", "baba", "baab")
> v <- c("aa", "bb", "ab", "ba")
> sapply(v, grep, s)
$aa
[1] 1 2 9

$bb
[1] 3 7

$ab
[1] 4 6 7 8 9

$ba
[1] 5 6 7 8 9

> lapply(v, grep, s)
[[1]]
[1] 1 2 9

[[2]]
[1] 3 7

[[3]]
[1] 4 6 7 8 9

[[4]]
[1] 5 6 7 8 9

No.22666 Re: 【R】 文字列の部分的マッチング charmatch  【明石】 2019/01/04(Fri) 08:19

青木先生 様;

お忙しいところを失礼いたします,明石と申します。
新年早々に,大変に良い勉強をさせていただきました。
この例題を通じて,今まで不得手であった sapply,lapplyも理解できました。
心から御礼を申し上げます。

No.22667 Re: 【R】 文字列の部分的マッチング charmatch  【明石】 2019/01/04(Fri) 17:07

青木先生 様;

お忙しいところを失礼いたします,明石と申します。

ベクトル v と s を与えて,部分一致照合の添字を得る方法のご教示をいただき,誠にありがとうございました。
大変に良い勉強をさせていただきました。
s <- c("aa", "aa", "bb", "ab", "ba", "abab", "abba", "baba", "baab")
v <- c("aa", "bb", "ab", "ba")

lapply(v, grep, s)

[[1]]
[1] 1 2 9

[[2]]
[1] 3 7

[[3]]
[1] 4 6 7 8 9

[[4]]
[1] 5 6 7 8 9
取得した添字を用いて,要素を得ることができます。
> res <- lapply(v, grep, s)
> s[res[[1]]]
[1] "aa" "aa" "baab"
> s[res[[2]]]
[1] "bb" "abba"
> s[res[[3]]]
[1] "ab" "abab" "abba" "baba" "baab"
> s[res[[4]]]
[1] "ba" "abab" "abba" "baba" "baab"
---------------------------------------
青木先生,追加のご質問がございます。
何卒どうぞよろしくお願いいたします

ベクトル v と s を与えて,部分一致照合の要素
"aa"   "aa"   "baab"
"bb" "abba"
"ab" "abab" "abba" "baba" "baab"
"ba" "abab" "abba" "baba" "baab"
を得る方法をご教示いただければ,大変に勉強になります。

お手数をおかけいたします。
何卒どうぞよろしくお願いいたします。

No.22668 Re: 【R】 文字列の部分的マッチング charmatch  【青木繁伸】 2019/01/04(Fri) 18:19

まあ,一行で書かなきゃいけないということでもないでしょうし,また,他に良い方法があるかもしれませんが,以下のようにすることでも出来なくはないです
> sapply(sapply(v, grep, s), function(i) s[i])
$aa
[1] "aa" "aa" "baab"

$bb
[1] "bb" "abba"

$ab
[1] "ab" "abab" "abba" "baba" "baab"

$ba
[1] "ba" "abab" "abba" "baba" "baab"

No.22669 Re: 【R】 文字列の部分的マッチング charmatch  【明石】 2019/01/04(Fri) 18:58

青木先生 様;

お忙しいところを失礼いたします,明石と申します。

sapply(v, grep, s)で得た添字を,s[]に代入する試みをしていましたが,結局できませんでした。

ご教示いただきました関数を定義する方法を理解できました。

ありがたいご教示に,心から,心より感謝いたします。
ありがとうございました。

● 「統計学関連なんでもあり」の過去ログ--- 048 の目次へジャンプ
● 「統計学関連なんでもあり」の目次へジャンプ
● 直前のページへ戻る