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> 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"
5 Réponses :
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"
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"
AS @ user2974951 souligne dans son commentaire, Si vous devez utiliser 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>.
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"
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"
C'était une explication vraiment très utile pour laquelle cela se produit! Merci beaucoup!
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"
Cela ne fonctionne que dans une seule chaîne, vous avez un vecteur de chaîne, chaque élément est traité séparément.