2017-09-21 2 views
1

J'ai une trame de données dt:Ajouter un préfixe à chaque ligne d'une colonne si elle ne contient pas

dt <- data.frame(id=c(1,2,3),value=c("a","_b","c")) 

Maintenant, je veux ajouter le préfixe _ à chaque « valeur » qui ne commence pas par _ , de sorte que la trame de données résultant est

id, value 
1, _a 
2, _b 
3, _c 

Je sais que je peux utiliser la fonction substr pour vérifier si une valeur commence par _, mais je ne veux pas le faire avec une boucle. Je veux utiliser les fonctions d'application. Comment dois-je procéder? Je suis nouveau pour appliquer des fonctions en passant.

--- Edit: merci à tous pour vos solutions. Désolé mais j'ai trop simplifié mon cas réel. Dans mon cas réel, je dois ajouter le préfixe _ aux valeurs qui ne commencent pas par &, différents symboles. --- Edit2: Il suffit de réaliser que c'est la même chose. Ce qui suit fera

dt$value <- gsub("^([^&].*)", "_\\1", dt$value) 

Répondre

1

Une autre option ...

dt$value <- gsub("^([^_].*)", "_\\1", dt$value) 

dt 
    id value 
1 1 _a 
2 2 _b 
3 3 _c 

La première regex recherche le début d'une chaîne suivie par quelque chose qui ne _, plus les caractères suivants, et il remplace la seconde regex, qui est _ plus le groupe de capture de la première regex.

1

Nous pourrions utiliser sub pour correspondre à caractère non un _ ([^_]) depuis le début (^) de la chaîne, le capturer en tant que groupe ((...)) et le remplacer par le _ suivi du backreference (\\1) du groupe capturé

levels(dt$value) <- sub("^([^_])", "_\\1", levels(dt$value)) 
dt$value 
#[1] _a _b _c 
#Levels: _b _a _c 
1

solution factice, mais fonctionne ... Remplacer début de chaque chaîne avec _ et si la re sont deux _ (__) puis retournent un seul.

dt$value <- sub("__", "_", sub("^", "_", dt$value)) 
dt$value 
#[1] "_a" "_b" "_c"