如何从列名称中替换第二次或更多次出现的点

Jen*_*fer 2 regex r gsub

伙计们,我该如何替换列名中第二次出现的点?

样本数据:

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)
Run Code Online (Sandbox Code Playgroud)

我试过了,但是它删除了所有带下划线的点。我只想用下划线替换第二个或多个出现的事件。

names(survey) = gsub("\\.", "_", names(survey))
names(survey)
# [1] "age_range_abc"   "gender_region_q" "region_g_a"      "physi" 
Run Code Online (Sandbox Code Playgroud)

谢谢,J

G5W*_*G5W 7

本着您原始代码的精神:

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

一些额外的细节,以防万一。

\\.匹配的第一个.
.*?的.任何字符相匹配。.*匹配任何字符的零个或多个实例。但是匹配是贪婪的。它会尽可能匹配。我想要不贪心的匹配(仅直到第二个匹配.),所以我添加了?抑制贪婪的比赛和.*?任何字符组的比赛,直到我们作为regex命中,接下来的事情......
另一个\\.以匹配第二.。
由于第一部分用括号括(\\..*?)起来,因此存储为\ 1,因此替换模式\\1_将恢复第二部分之前的所有内容.,第二.部分用替换_。

  • “一些额外的细节”非常有帮助 G5W (2认同)