How to look for a word within a text in R

Asked

Viewed 474 times

3

I need to know if within a certain text there is a specific word, for example fnord. So far I’ve only found:

x<-"fnord: Você não tem nivel de acesso a está informação."
strsplit(x, "[[:punct:] ]")
[[1]]
[1] "fnord"      ""           "Você"       "não"        "tem"        "nivel"      "de"        
[8] "acesso"     "a"          "está"       "informação"

I saw something about the function grep, but I couldn’t get it right.
And I’d prefer an answer like TRUE or FALSE.

  • 3

    grepl("fnord", x). Behold help("regexp"). Note: grepl is the grep l. In addition, it is known to use patterns such as "[[:punct:] ]" you won’t find regular expressions hard to learn.

  • I didn’t even know there were "regular expressions"

1 answer

4


@Rui-Arradas has already given the answer in the comments, this is just a elaboration. First, let’s create an example with more phrases.

string.vector <- c(
  "gnoll: Você tem acesso total a esta informação.",
  "stack: Você tem acesso parcial a esta informação.",
  "fnord: Você não tem nivel de acesso a esta informação.",
  "fnord: Você poderia ter acesso a esta informação."
)

> string.vector
[1] "gnoll: Você tem acesso total a esta informação."       
[2] "stack: Você tem acesso parcial a esta informação."     
[3] "fnord: Você não tem nivel de acesso a esta informação."
[4] "fnord: Você poderia ter acesso a esta informação."     

grep will give you the indexes (positions) in which the pattern you are looking for was found. grepl will give you TRUE/FALSE for all positions:

> grep('fnord', string.vector)
[1] 3 4

> grepl('fnord', string.vector)
[1] FALSE FALSE  TRUE  TRUE

strsplit generates a list with the strings separated according to the criteria you have established (scores and spaces, in this case):

split.list <- strsplit(string.vector, "[[:punct:] ]")

> split.list
[[1]]
[1] "gnoll"      ""           "Você"       "tem"        "acesso"    
[6] "total"      "a"          "esta"       "informação"

[[2]]
[1] "stack"      ""           "Você"       "tem"        "acesso"    
[6] "parcial"    "a"          "esta"       "informação"

[[3]]
[1] "fnord"      ""           "Você"       "não"        "tem"       
[6] "nivel"      "de"         "acesso"     "a"          "esta"      
[11] "informação"

[[4]]
[1] "fnord"      ""           "Você"       "poderia"    "ter"       
[6] "acesso"     "a"          "esta"       "informação"

Applying grep and grepl here will give you the same result, because it is being indicated which items in the list have the search key:

> grep('fnord', split.list)
[1] 3 4

> grepl('fnord', split.list)
[1] FALSE FALSE  TRUE  TRUE

You can use lapply to apply grep/grepl to each element in the list

> lapply(split.list, grep, pattern = 'fnord')
[[1]]
integer(0)

[[2]]
integer(0)

[[3]]
[1] 1

[[4]]
[1] 1

> lapply(split.list, grepl, pattern = 'fnord')
[[1]]
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

[[2]]
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

[[3]]
[1]  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

[[4]]
[1]  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

The package stringr has friendly functions to work with text strings. Check the vignette of it on regular expressions (in English).

Browser other questions tagged

You are not signed in. Login or sign up in order to post.