4 votes

extraire une chaîne de plusieurs colonnes dans une nouvelle colonne

Je veux trouver un mot dans différentes colonnes et le faire muter dans une nouvelle colonne.

"données" est un exemple et "objectif" est ce que je veux. J'ai beaucoup essayé mais je n'ai pas réussi à le faire fonctionner.

 library(dplyr)
 library(stringr)

 data <- tibble(
    component1 = c(NA, NA, "Word", NA, NA, "Word"),
    component2 = c(NA, "Word", "different_word", NA, NA, "not_this")
    )

 goal <- tibble(
    component1 = c(NA, NA, "Word", NA, NA, "Word"),
    component2 = c(NA, "Word", "different_word", NA, NA, "not_this"),
    component = c(NA, "Word", "Word", NA, NA, "Word")
    )

not_working <- data %>%
     mutate(component = across(starts_with("component"), ~ str_extract(.x, "Word")))

7voto

TarJae Points 9674

Pour la structure de données que vous avez fournie, nous pourrions utiliser coalesce :

library(dplyr)

data %>% 
  mutate(component = coalesce(component1, component2))

component1 component2     component
  <chr>      <chr>          <chr>    
1 NA         NA             NA       
2 NA         Word           Word     
3 Word       different_word Word     
4 NA         NA             NA       
5 NA         NA             NA       
6 Word       not_this       Word

3voto

Maël Points 644

Avec if_any y str_detect :

library(dplyr)
library(stringr)
data %>% 
  mutate(component = ifelse(if_any(starts_with("component"), str_detect, "Word"), "Word", NA))

sortie

  component1 component2     component
  <chr>      <chr>          <chr>    
1 NA         NA             NA       
2 NA         Word           Word     
3 Word       different_word Word     
4 NA         NA             NA       
5 NA         NA             NA       
6 Word       not_this       Word   

Si vous voulez vous en tenir à str_extract c'est ce qu'il faut faire :

data %>%
  mutate(across(starts_with("component"), str_extract, "Word", 
         .names = "{.col}_extract")) %>% 
  mutate(component = coalesce(component1_extract, component2_extract),
         .keep = "unused")

# A tibble: 6 × 3
  component1     component2     component
  <chr>          <chr>          <chr>    
1 NA             NA             NA       
2 NA             Word           Word     
3 Word           different_word Word     
4 NA             NA             NA       
5 NA             NA             NA       
6 different_word Word           Word

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X