Y a-t-il un moyen dans R de vérifier si une valeur dans une colonne contient une valeur dans une autre colonne? Dans l'exemple ci-dessous, j'essaie de voir si les valeurs de col2 sont contenues dans les valeurs de col1 (indépendamment dans chaque ligne) mais j'obtiens un message d'avertissement: "l'argument 'pattern' a une longueur> 1 et seul le premier élément sera utilisé ". La colonne d'indicateur doit indiquer «Oui» pour la première / dernière ligne et «Non» pour les 2e et 3e lignes. Toute réflexion sur la manière de résoudre serait grandement appréciée.
col1 <- c("R.S.U.L.C","S.I.W","P.U.E","A.E.N") col2 <- c("R","U","I","N") df2 <- data.frame(col1,col2) df2$Flag <- ifelse(grepl(df2$col2,df2$col1),"Yes","No")
3 Réponses :
Cela peut être fait avec une combinaison de sapply / grepl
. Faites une boucle le long de df2 $ col
et grepl
dans la chaîne df $ col1
.
Le one-liner est évident.
i <- sapply(seq_along(df2$col2), function(i) grepl(df2$col2[i], df2$col1[i])) df2$Flag <- c("No", "Yes")[i + 1L] df2 # col1 col2 Flag #1 R.S.U.L.C R Yes #2 S.I.W U No #3 P.U.E I No #4 A.E.N N Yes
df2 $ flag <- mapply (grepl, df2 $ col2, df2 $ col1)
grepl ()
utilise uniquement le premier élément:
Voir ? grepl
:
Si un vecteur de caractères de longueur 2 ou plus est fourni, le premier L'élément est utilisé avec un avertissement.
Nous pouvons utiliser str_detect
qui est vectorisé à la fois pour le motif et la chaîne
library(dplyr) library(stringr) df2 <- df2 %>% mutate(Flag = c('No', 'Yes')[1+str_detect(col1, as.character(col2))]) df2 # col1 col2 Flag #1 R.S.U.L.C R Yes #2 S.I.W U No #3 P.U.E I No #4 A.E.N N Yes