2017-08-31 1 views
2

je la trame de données suivantechaîne de substitution sans altérer d'autres chaînes intégrées

df <- data.frame(c(1, 2, 3, 4), c("T-A1", "T-A1-2", "T-A1-3", "T-A1-4"), c("apple", "banana", "pear", "orange")) 
names(df) <- c("num", "name", "fruit") 

    num name fruit 
1 1 T-A1 apple 
2 2 T-A1-2 banana 
3 3 T-A1-3 pear 
4 4 T-A1-4 orange 

Je dois changer "T-A1" à "T-A1-1"

num name fruit  num name fruit 
1 1 T-A1 apple  1 1 T-A1-1 apple 
2 2 T-A1-2 banana -> 2 2 T-A1-2 banana 
3 3 T-A1-3 pear  3 3 T-A1-3 pear 
4 4 T-A1-4 orange  4 4 T-A1-4 orange 

J'ai utilisé cette fonction:

df$name <- gsub("T-A1", "T-A1-1", df$name) 

Mais le résultat que je reçois est celui-ci:

num name fruit 
1 1 T-A1-1 apple 
2 2 T-A1-1-2 banana 
3 3 T-A1-1-3 pear 
4 4 T-A1-1-4 orange 

J'ai ensuite essayé cette formule:

df$name <- gsub("T-A1", "T-A1-1", df$name, fixed = TRUE) 

Mais je reçois toujours les mêmes résultats que mentionné précédemment.

La situation idéale serait de pouvoir remplacer "T-A1" quand son seul "T-A1", peu importe s'il est imbriqué dans un autre mot que ce soit au début, au milieu ou à la fin. En d'autres termes, si certaines entrées ressemblent à ce "mot T-A1", "mot-T-A1" ou "wo-T-A1-rd", elles ne devraient pas être affectées et leur Les sections "T-A1" resteraient intactes. La seule fois où je veux remplacer "T-A1" est quand il est juste "T-A1" par lui-même.

R version 3.4.1 Winodws 7 64 bit

Répondre

2

Vous devez dire gsub que T-A1 est la chaîne exacte que vous recherchez.

df$name <- gsub("^T-A1$", "T-A1-1", df$name) 

## num name fruit 
## 1 1 T-A1-1 apple 
## 2 2 T-A1-2 banana 
## 3 3 T-A1-3 pear 
## 4 4 T-A1-4 orange 

Cela fonctionne parce que $ dit gsub que T-A1 devrait se produire à la fin de la chaîne et ^ dit-il que ce devrait être le début de celui-ci. Dépend de votre jeu de données réel, vous devrez peut-être utiliser une autre expression .

Ce regex-faq peut vous donner quelques idées.