2016-04-25 1 views
-1

私は、例えばサッカー選手の名前をdata.frameを、持っている:文字ベクトルのdata.frameから名前を検索するfor-loopを書くには?

names <- data.frame(id=c(1,2,3,4,5,6,7), 
      year=c('Maradona', 'Cruyff', 'Messi', 'Ronaldo', 'Pele', 'Van Basten', 'Diego')) 

> names 
    id  year 
1 1 Maradona 
2 2  Cruyff 
3 3  Messi 
4 4 Ronaldo 
5 5  Pele 
6 6 Van Basten 
7 7  Diego 

私はまた、6000は、これらのサッカー選手の話を含む、テキストファイルを掻き取ってきました。これらの物語は、storiesという大きなベクトルに6,000要素として格納されています。

各フットボール選手の名前を検索するループ(または適用機能)を書く方法がありますか?一致または複数の一致が発生した場合は、要素番号とフットボールプレイヤーの名前を記録します。例えば

stories[1]に次のテキストを考えてみます。

Diego Armando Maradona (born 30 October 1960) is a retired Argentine 
professional footballer. He has served as a manager and coach at other 
clubs as well as the national team of Argentina. Many in the sport, 
including football writers, former players, current players and 
football fans, regard Maradona as the greatest football player of all 
time. He was joint FIFA Player of the 20th Century 
with Pele. 

理想的なdata.frameは、以下の構造を持っているでしょう:

> outcome 
    element name1 name2 
1  1 Maradona Pele 

誰かが、その結果、このようなコードを書くための方法を知っていますがすべてのフットボール選手の情報を持つ1つのdata.frame?

+2

私は、例えば、このようなテキストマイニングの手法を検討しますhttps://rstudio-pubs-static.s3.amazonaws.com/31867_8236987cf0a8444e962ccd2aec46d9c3.html – Jimbou

+0

また出力ファイルにDiegoも1つのカウントで見つかるはずです。 – Jimbou

+0

@ジンボウ:そうです。そしてあなたは鋭い目を持っています。 –

答えて

0

私はちょうどループでそれをやったが、多分あなたは、私は正確にあなたの質問をundertsandません適用機能

#Make sure you include stringsAsFactors = F or my code won't work 
football_names <- data.frame(id=c(1:7), 
       year=c('Maradona', 'Cruyff', 'Messi', 'Ronaldo', 'Pele', 'Van Basten', 'Diego'),stringsAsFactors = F) 


outcome <- data.frame(element=football_names$id) 

for (i in 1:nrow(football_names)){ 
    names_in_story <- football_names$year[football_names$year %in% unlist(strsplit(stories[i],split=" "))] 

    for (j in 1:length(names_in_story)){ 
    outcome[i,j+1] <- names_in_story[j] 
    } 

} 

names(outcome) <- c("element",paste0("name",1:(ncol(outcome)-1))) 
+0

なぜ「football_name $ year」を使用するのか尋ねてもよろしいですか? –

+0

'names()'関数があるので、 "名前"の代わりにデータフレームの名前として "football_names"を使用しました。そして、あなたは私が理解していなかったそのコラム「年」と名前をつけましたが、とにかく名前をつけました。 –

+0

私はそれを混乱させて見ました。ありがとう!私は実際のデータにコードを追加しようとしています。 –

0

でそれを行うことができます。しかし、stringr関数とlapplyを使って文字列の一致を試みることができます。 私はあなたのデータstoriesがリストであると仮定しました。 この関数は、関数に渡すすべての名前をベクトルとして検出し、それらの発生をカウントします。出力は再び一覧になります。

foo <- function(x,y) table(unlist(str_match_all(x,paste0(y,collapse = "|")))) 

結果

res <- lapply(series, foo,names$year) 

次に、あなたはこのように、たとえばデータ(rowSums())をマージしてまとめることができます。

Reduce(function(...) merge(..., all=T, by="Var1"), res) 
関連する問題