2016-07-29 2 views
1

У меня есть два списка. Первый имеет строки для каждого элемента. Во втором списке есть кадр данных для каждого элемента. В кадрах данных есть столбец «start» и другой «end», а также другая информация.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) 

Я надеюсь, что цикл первого текстового элемента и первого фрейма данных. Начальные и конечные столбцы фрейма данных могут использоваться в 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])))) 
    } 
} 

Но это не сработало. Я прочитал субтитровую виньетку, прочитал несколько вопросов, связанных с stackoverflow, и, похоже, не нашел пути для этого.

Цель состоит в том, чтобы получить список функций с извлеченными терминами, прилагаемыми к нему, как это было сделано для одного цикла выше. Спасибо за любую помощь.

ответ

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 "" is "" является "" s a lo "' to 'all.features [[1]]' и аналогичным образом для других. – user2100721

+1

@ user2100721 ​​- уверен - что-то вроде 'Map (function (tex, fea) cbind (fea, string = substring (tex, fea $ start, fea $ end)), all.text, all.features)' – thelatemail

+0

отлично! Спасибо. – user1370741

Смежные вопросы