如何从列名替换第二次或更多次点

时间:2017-03-28 19:03:12

标签: r regex 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)

我尝试了这个,但它用下划线删除所有点。我想用下划线替换第二次或更多次出现。

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

谢谢, Ĵ

3 个答案:

答案 0 :(得分:4)

本着原始代码的精神:

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

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

\\.与第一个.匹配 .*? .匹配任何字符。 .*匹配任何字符的零个或多个实例。但匹配是贪婪的;它会尽可能匹配。我希望匹配不贪心(直到第二个.),所以我添加了?压制贪婪的比赛,.*?匹配任何一组人物,直到我们在正则表达式中击中下一个东西是... 另一个\\.与第二个.匹配 因为第一部分用括号(\\..*?)括起来,所以它存储为\ 1,因此替换模式\\1_在第二部.之前恢复所有内容,第二部分.替换为_

答案 1 :(得分:1)

一个选项是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"  

答案 2 :(得分:0)

您可以将 sub(\\.[^.]*)\\. 一起使用

\\. 匹配 .

[^.] 匹配所有内容,但不匹配 .

* 匹配 0 次或多次

方括号 ( ) 用于存储匹配,此处在 \\1 中:

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

更明确地说,可以使用 ^([^.]*\\.[^.]*)\\.,其中第一个 ^ 表示字符串的开头:

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