Dynamically add columns to tibble

I'm trying to find a way to dynamically add columns to tibble. Each column is logical and tells whether some word appears in the first column. The number of columns to be added depends on the user input, i.e. words to be checked. This number could be 2 or more.
I feel like I should use purrr::map*() but can't figure out how to do that.

Here is an example:

suppressWarnings(library(shinipsum))
suppressWarnings(library(tidyverse))
set.seed(13)
# Create a tibble with sentences of variable length
my_df <- tibble(sentences = map_chr(.x = sample(1:15, 10, replace = TRUE), 
                                    ~ random_text(nwords = .x)))
my_df
#> # A tibble: 10 x 1
#>    sentences                                                                    
#>    <chr>                                                                        
#>  1 Lorem ipsum dolor sit amet consectetur adipiscing elit                       
#>  2 Lorem ipsum dolor                                                            
#>  3 Lorem ipsum dolor sit amet                                                   
#>  4 Lorem ipsum dolor sit amet consectetur adipiscing elit Quisque tellus        
#>  5 Lorem ipsum dolor sit amet consectetur adipiscing elit Quisque tellus urna p~
#>  6 Lorem ipsum dolor sit amet consectetur                                       
#>  7 Lorem ipsum dolor sit amet consectetur                                       
#>  8 Lorem ipsum dolor sit                                                        
#>  9 Lorem ipsum dolor sit amet consectetur adipiscing elit Quisque tellus urna p~
#> 10 Lorem ipsum dolor sit amet consectetur adipiscing elit Quisque tellus urna p~

# Words to be searched
nwords <- sample(2:5, 1)
words <- random_text(nwords = 15) %>%
  str_split(pattern = " ") %>%
  unlist() %>%
  sample(nwords)
words
#> [1] "dolor"      "Lorem"      "tellus"     "adipiscing" "placerat"

# Outcome should looks like this but number of "word_*" column should be 
# equal to length(words)
my_df <- my_df %>%
  mutate(word_1 = str_detect(sentences, pattern = words[1]),
         word_2 = str_detect(sentences, pattern = words[2])
         # etc
  )
my_df
#> # A tibble: 10 x 3
#>    sentences                                                       word_1 word_2
#>    <chr>                                                           <lgl>  <lgl> 
#>  1 Lorem ipsum dolor sit amet consectetur adipiscing elit          TRUE   TRUE  
#>  2 Lorem ipsum dolor                                               TRUE   TRUE  
#>  3 Lorem ipsum dolor sit amet                                      TRUE   TRUE  
#>  4 Lorem ipsum dolor sit amet consectetur adipiscing elit Quisque~ TRUE   TRUE  
#>  5 Lorem ipsum dolor sit amet consectetur adipiscing elit Quisque~ TRUE   TRUE  
#>  6 Lorem ipsum dolor sit amet consectetur                          TRUE   TRUE  
#>  7 Lorem ipsum dolor sit amet consectetur                          TRUE   TRUE  
#>  8 Lorem ipsum dolor sit                                           TRUE   TRUE  
#>  9 Lorem ipsum dolor sit amet consectetur adipiscing elit Quisque~ TRUE   TRUE  
#> 10 Lorem ipsum dolor sit amet consectetur adipiscing elit Quisque~ TRUE   TRUE

in addition to your current code

library(glue)
library(rlang)
(mutator_expressions <- map(words,~parse_expr(glue("str_detect(sentences, pattern = '{.x}')"))) %>%
                          set_names(glue("word_{seq_along(words)}")))

 my_df %>%
  mutate(!!!mutator_expressions )

 #or 
 (mutator_expressions <- map(words,~parse_expr(glue("str_detect(sentences, pattern = '{.x}')"))) %>%
     set_names(glue("detected_{words}")))
 
 my_df %>%
   mutate(!!!mutator_expressions )
1 Like

This topic was automatically closed 7 days after the last reply. New replies are no longer allowed.

If you have a query related to it or one of the replies, start a new topic and refer back with a link.