-1
votes

la fonction sub () remplace toutes les correspondances

C'est moi encore moi,

J'ai un problème avec le sous () - fonction dans R: La documentation indique: "Sub et GSub effectuent le remplacement des premiers et tous les matchs respectivement." P>

J'ai un code, où je veux remplacer un seul élément par un autre (conditionnellement, dire que si un élément apparaît. Je veux que ce soit deux fois dans un vecteur - mais ce n'est pas nécessaire les informations ici). P>

Cependant, si j'effectue la sous-fonction, elle remplace tout. Ici, un code pour démontrer ce qui se passe: p> xxx pré>

Comme vous pouvez le constater, dans mon cas SUB et GSub effectuer la même action, mais je souhaite que le résultat soit le suivant:

a = c("a", "b", "c", "d", "a", "b", "c", "d", "a", "a")
> sub("a", "f", a)
[1] "f" "b" "c" "d" "a" "b" "c" "d" "a" "a"


1 commentaires

Cela ne fonctionne que dans une seule chaîne, vous avez un vecteur de chaîne, chaque élément est traité séparément.


5 Réponses :


0
votes

Vous pouvez utiliser grepl code> ici pour trouver tous les indices de votre vecteur d'entrée contenant "a" code>. Ensuite, remplacez sélectivement uniquement le premier index de correspondance.

a <- c("a", "b", "c", "d", "a", "b", "c", "d", "a", "a")
a[min(which(grepl("a", a) == TRUE))] <- "f"
a

[1] "f" "b" "c" "d" "a" "b" "c" "d" "a" "a"


0 commentaires

1
votes

supposer qu'un seul caractère par élément, et si vous pouvez vous permettre de fusionner et de scinder les vecteurs, vous pouvez faire

> unlist(strsplit(sub("a","f",paste0(a,collapse="")),""))
 [1] "f" "b" "c" "d" "a" "b" "c" "d" "a" "a"


0 commentaires

0
votes

AS @ user2974951 souligne dans son commentaire, SUB (PAT, RÉPP, X) CODE> est vectorisé, ce qui signifie qu'il remplacera la première instance de PAT code> avec avec RÉPL code> dans chaque élément em> de x code>.

Si vous devez utiliser Sub code>, vous pouvez concaténer les entrées, remplacer PAT code> avec replez code>, puis divisez la chaîne à nouveau sur chaque caractère. P>

unlist(strsplit(sub("a", "f", paste0(a, collapse = "")), ""))
#[1] "f" "b" "c" "d" "a" "b" "c" "d" "a" "a"


0 commentaires

2
votes

La regex dans sub code> traite chaque vecteur différemment. Peut-être que l'exemple ci-dessous pourrait vous aider à comprendre la différence d'entre eux.

a = c("a", "b", "c", "d", "a", "b", "c", "d", "a", "a")
a[which.max(a == "a")] <- "f"
a
#[1] "f" "b" "c" "d" "a" "b" "c" "d" "a" "a"


1 commentaires

C'était une explication vraiment très utile pour laquelle cela se produit! Merci beaucoup!



3
votes

Vous pouvez utiliser match code> pour rechercher le premier coup et utiliser l'index retourné pour remplacer la chaîne.

a[match("a", a)]  <- "f"
a
# [1] "f" "b" "c" "d" "a" "b" "c" "d" "a" "a"


0 commentaires