2017-10-10 13 views
1

J'ai deux trames de données. La première:Marquer le texte en utilisant grep et coller dans r

keyword <- c("apple","peach","grape","berry","kiwi fruit") 
keyword <- data.frame(keyword) 

enter image description here

Le second:

sentence <- c("I like apple","I hate apple","grape is good") 
url <- c("url1","url2","url3") 
sentence <- data.frame(sentence,url) 

enter image description here

Ce que je dois savoir: si mot-clé est contenue dans la phrase, coller URL pour le texte . Si plusieurs phrases contiennent le mot-clé, collez toutes les URL. Le résultat final est comme:

enter image description here

J'ai essayé d'utiliser le code comme ci-dessous, mais il ne fonctionne pas comme prévu.

keyword$Label <- character(length(keyword$keyword)) 

for (i in 1:length(keyword$keyword)) { 
keyword$Label[grep(keyword$keyword[i],sentence$sentence)] <- sentence$url 
} 
+0

Avez-vous besoin d'aide pour comprendre COMMENT cela devrait être fait? (code-sage) Ou voulez-vous savoir ce qui devrait être fait? (concept-wise) Je suggérerais de faire quelque chose comme une jointure conditionnelle ... (concept sage) – zwep

+0

J'ai besoin de la solution de code-sage. Merci –

Répondre

2

Une solution avec stringr + dplyr + tidyr:

library(stringr) 
library(dplyr) 
library(tidyr) 

sentence %>% 
    mutate(sentence = str_extract(sentence, paste0(keyword$keyword, collapse = "|"))) %>% 
    right_join(keyword, by = c("sentence" = "keyword")) %>% 
    group_by(sentence) %>% 
    mutate(URL = 1:n()) %>% 
    spread(URL, url, sep = "") %>% 
    rename(keyword = sentence) 

Résultat:

# A tibble: 5 x 3 
# Groups: keyword [5] 
    keyword URL1 URL2 
*  <chr> <chr> <chr> 
1  apple url1 url2 
2  berry <NA> <NA> 
3  grape url3 <NA> 
4 kiwi fruit <NA> <NA> 
5  peach <NA> <NA> 

données:

keyword <- c("apple","peach","grape","berry","kiwi fruit") 
keyword <- data.frame(keyword, stringsAsFactors = FALSE) 
sentence <- c("I like apple","I hate apple","grape is good") 
url <- c("url1","url2","url3") 
sentence <- data.frame(sentence,url, stringsAsFactors = FALSE)