1
votes

Colonne R Vérifier si contient la valeur d'une autre colonne

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")


0 commentaires

3 Réponses :


2
votes

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


0 commentaires

2
votes

df2 $ flag <- mapply (grepl, df2 $ col2, df2 $ col1)

L'argument pattern de

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.


0 commentaires

0
votes

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


0 commentaires