2017-03-28 1 views
1

Folks, comment puis-je remplacer la deuxième occurrence d'un point par un nom de colonne?Comment remplacer une ou plusieurs occurrences d'un point d'un nom de colonne

données Exemple:

age.range.abc = sample(c("ar2-15", "ar16-29", "ar30-44"), 200, replace = TRUE) 
gender.region.q = sample(c("M", "F"), 200, replace = TRUE) 
region_g.a = sample(c("A", "B", "C"), 200, replace = TRUE) 
physi = sample(c("Poor", "Average", "Good"), 200, replace = TRUE) 
survey = data.frame(age.range.abc, gender.region.q, region_g.a,physi) 
head(survey) 

J'ai essayé, mais il supprime tous les points avec underscore. Je veux remplacer seulement la deuxième ou plusieurs occurrences avec le trait de soulignement.

names(survey) = gsub("\\.", "_", names(survey)) 
names(survey) 
# [1] "age_range_abc" "gender_region_q" "region_g_a"  "physi" 

Merci, J

Répondre

3

Dans l'esprit de votre code d'origine:

names(survey) = sub("(\\..*?)\\.", "\\1_", names(survey)) 
names(survey) 
[1] "age.range_abc" "gender.region_q" "region_g.a"  "physi" 

Un petit détail supplémentaire dans le cas où il aide.

\\. correspond à la première .
.*? Le . correspond à tout caractère. .* correspond à zéro ou plusieurs instances de n'importe quel caractère. Mais l'appariement est gourmand; il correspondrait autant que possible. Je veux faire correspondre ce qui n'est pas gourmand (seulement jusqu'à la deuxième .) donc j'ai ajouté? pour supprimer le match gourmand et .*? correspond à n'importe quel groupe de caractères jusqu'à ce que nous touchons la prochaine chose dans l'expression régulière qui est ...
un autre \\. pour correspondre à la deuxième ..
Étant donné que la première partie était entre parenthèses (\\..*?), elle est stockée sous la forme \ 1, de sorte que le modèle de substitution \\1_ restaure tout avant le second . et le second . est remplacé par _.

+0

"petit détail supplémentaire" a été très utile G5W – Jennifer

1

Une option est strsplit

names(survey) <- sapply(strsplit(names(survey), "[.]"), function(x) 
    if(length(x) >1) paste(x[1], paste(x[-1], collapse="_"), sep=".") else x) 
names(survey) 
#[1] "age.range_abc" "gender.region_q" "region_g.a"  "physi"