2017-07-13 2 views
0

J'ai une liste de mots-clés:Nombre 1 ère instance de mot-clé dans la liste sans compte en double dans R

library(stringr) 
words <- as.character(c("decomposed", "no diagnosis","decomposition","autolysed","maggots", "poor body", "poor","not suitable", "not possible")) 

Je veux faire correspondre ces mots-clés au texte dans une colonne de trame de données (df $ text) et le nombre le nombre de fois qu'un mot-clé se produit dans un autre data.frame (matchdf):

matchdf<- data.frame(Keywords=words) 
m_match<-sapply(1:length(words), function(x) sum(str_count(tolower(df$text),words[[x]]))) 
matchdf$matchs<-m_match 

Cependant, je l'ai remarqué que cette méthode compte chaque occurrence d'un mot-clé dans une colonne. par exemple)

"The sample was too decomposed to perform an analysis. The decomposed sample indicated that this animal was dead for a long time" 

retournerait alors un compte de 2. Cependant, je veux seulement compter la première instance de « décomposée » dans un champ.

Je pensais qu'il y aurait un moyen de ne compter que la première instance en utilisant str_count mais il ne semble pas en être un.

+5

Vous ne voulez pas 'str_detect' alors ? – CPak

Répondre

1

Le stringr n'est pas strictement nécessaire dans cet exemple, grepl de base R suffira. Cela dit, utiliser str_detect au lieu de grepl, si vous préférez la fonction de package (comme l'a souligné @ Chi-Pak en commentaire)

library(stringr) 

words <- c("decomposed", "no diagnosis","decomposition","autolysed","maggots", 
      "poor body", "poor","not suitable", "not possible") 

df <- data.frame(text = "The sample was too decomposed to perform an analysis. The decomposed sample indicated that this animal was dead for a long time") 

matchdf <- data.frame(Keywords = words, stringsAsFactors = FALSE) 

# Base R grepl 
matchdf$matches1 <- sapply(1:length(words), function(x) as.numeric(grepl(words[x], tolower(df$text)))) 

# Stringr function 
matchdf$matches2 <- sapply(1:length(words), function(x) as.numeric(str_detect(tolower(df$text),words[[x]]))) 

matchdf 

Résultat

 Keywords matches1 matches2 
1 decomposed  1  1 
2 no diagnosis  0  0 
3 decomposition  0  0 
4  autolysed  0  0 
5  maggots  0  0 
6  poor body  0  0 
7   poor  0  0 
8 not suitable  0  0 
9 not possible  0  0