2016-07-29 19 views
1

私は2つのリストを持っています。最初の要素には各要素の文字列があります。 2番目のリストには、各要素のデータフレームがあります。データフレームには、他の情報とともに、「開始」列と「終了」列があります。2つのリストのR substr

text<-'this is a long text. its not an email' 
text0<-'another piece of text' 
text1<-'last sentence of nonsense' 
all.text<-list(text,text0,text1) 
features1<-data.frame(start=c(1,3,5,7),end=c(2,5,9,12),type=c('na','person','person','location')) 
features2<-data.frame(start=c(1,3,5,7),end=c(2,5,9,12),type=c('na','person','person','location')) 
features3<-data.frame(start=c(7,8,10,12),end=c(9,9,11,15),type=c('na','person','person','location')) 
all.features<-list(features1,features2, features3) 

最初のテキスト要素と最初のデータフレームを循環させたいと考えています。データフレームの列startとendは、テキストを抽出するためにsubstr内で使用できます。

個々のテキスト要素については、以下のループを使用してフィーチャデータフレームに追加することができます。

one.text<-NULL 
for (i in 1:nrow(features1)) one.text[i]<-((substr(text,features1[i,1],features1[i,2]))) 
features1$word<-one.text 

しかし、私はlapplyを使用する方法やループをネストする方法を見つけることができません。明らかに、もし私がそれらが非効率的であると読んだとしても、ループを使用したくないのです。私が試してみました事のいくつか:

named.get<-function(text.list,features.list){ 
    named.entities<-substr(text.list,features.list[,1],features.list[,2]) 
} 
all<-sapply(all.text,named.get,all.features) 

またはネストされたループ

one.obj<-NULL 
two.obj<-NULL 
for(i in 1:length(all.text)){ 
    for (j in 1:length(all.features)){ 
    one.obj[j]<-list([i]<-((substr(all.text[i],all.features[[i]][j,1],all.features[[i]][j,2])))) 
    } 
} 

しかし、それはどちらか動作しませんでした。私はsubstrビネットを読んで、複数のstackoverflowの質問を読んで、これで進む方法を見つけることができないようです。

目的は、上の1つのループのように、抽出された用語をフィーチャリストに追加することです。ご協力いただきありがとうございます。

答えて

1

double-for-loopに相当するのは、対応するリストの両方を引数として渡してMapを使用することです。その後、substringがベクトル化されて最終的な抽出が行われるという事実を利用することができます。

Map(function(tex,fea) substring(tex, fea$start, fea$end), all.text, all.features) 
#[[1]] 
#[1] "th"  "is " " is a" "s a lo" 
# 
#[[2]] 
#[1] "an"  "oth" "her p" "r piec" 
# 
#[[3]] 
#[1] "ent" "nt" "en" "ce o" 
+0

私自身の好奇心のために、これらの出力を対応する場所に追加できますか?つまり、#[1] "th" ""は "all.features [[1]]"への "lo" "であり、他のものについても同様です。 – user2100721

+1

@ user2100721 - 確かに 'Map(function(tex、fea)cbind(fea、string = substring(tex、fea $ start、fea $ end))、all.text、all.featuresのようなもの) ' – thelatemail

+0

優秀!ありがとうございました。 – user1370741