2017-12-07 31 views
0

名前にスペースが含まれている姓を1つのブロックとして抽出する方法はありますか?どのようにして、空白を含む姓を「1つの名前」/「en bloc」として抽出しますか?

「私はこの

clear 
input str40 name 
"R. P. de la Espriella Guerrero"   
"J. de Carvalho Ponce"     
"E. De Freitas Drumond"     
"R. de la Fuente and M. E. Medina-Mora" 
"C. Van Heyningen and I. D. Watson" 
"A. Z. van de Wiel and D. W. de Lange" 
end 

ようになり、データセットの名前は、私が唯一の最初の姓(これだけ最初の著者や他の著者を除く)をしたいしているが、私は、スペースを持っているそれらの名前を抽出したいですen bloc 'と呼ばれる。例えば、

clear 
input str40 name 
"de la Espriella Guerrero"   
"de Carvalho Ponce"     
"De Freitas Drumond"    
"de la Fuente" 
"Van Heyningen" 
"van de Wiel" 
end 

私はどんな助けにも感謝します。

ありがとうございます。

+0

'と'が名前の一部であるかどうかはどうやって決めるのですか?ありがとう@bew。 – bew

+0

これは残念なことに難しさの一部です。すべての 'の後にはスペースが続き、その後大文字の頭文字で始まる別の名前(例えば、D.L.Lange) –

+0

は、大文字でもあります。 De、Duなど –

答えて

1

ここに、私のコメントに記載された2つのルールを実装するコードを示します。使用されているStataのバージョンがUnicode文字列関数をサポートしていることを前提としています。

clear 
input str40 name 
"R. P. de la Espriella Guerrero"   
"J. de Carvalho Ponce"     
"E. De Freitas Drumond"     
"R. de la Fuente and M. E. Medina-Mora" 
"C. Van Heyningen and I. D. Watson" 
"A. Z. van de Wiel and D. W. de Lange" 
end 
generate surname = name 
replace surname = usubstr(surname,1,ustrpos(surname+" and "," and ")-1) 
list, clean noobs 
replace surname = usubstr(surname,ustrrpos(surname,". ")+1,.) 
list, clean noobs 
+0

ありがとうございます。仕事をしているようだ。ちょうど2番目のusubstrが姓の前にスペースを生成することに気付きました。だから、私はこれを少し修正して 'surname = usubstr(姓、ustrrpos(姓、"。 ")+2、。)を置き換えました。 開始位置が「。」(つまりスペース/空白を含むフルストップ)として指定されているため、これがなぜ発生するのかは完全にはわかりません。 ustrrposは "。"と "。"を扱いますか?同じですか? –

+0

また、教育のために、plsは '.'が2番目のusubstrで何をしているのかを知らせることができますか? つまり 'usubstr(s、n1、n2)'では、 'n2 ==。'は何をしますか? –

+0

良いキャッチ。実際に 'ustrrpos(surname、"。 ")'は ''。 ''の最初の文字の位置を返すので、2の代わりに1を加えることは自分の見落としです。あなたの2番目の質問については、 'help usubstr()'の出力を見直すことをお勧めします.Stataのオンラインヘルプはこのような質問の最初の停止点になるはずですので、この応答はあなたにもっと慣れ親しむことを奨励するものです。 –