【问题标题】:How to replace second or more occurrences of a dot from a column name如何从列名中替换第二次或多次出现的点
【发布时间】:2017-03-28 19:03:11
【问题描述】:

各位,如何替换列名中第二次出现的点?

样本数据:

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" 

谢谢, J

【问题讨论】:

    标签: r regex gsub


    【解决方案1】:

    本着您原始代码的精神:

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

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

    \\. 匹配第一个 .
    .*? . 匹配任何字符。 .* 匹配任何字符的零个或多个实例。但是匹配是贪心的;它会尽可能匹配。我想要不贪婪的匹配(直到第二个.)所以我添加了?抑制贪婪匹配,.*? 匹配任何字符组,直到我们点击正则表达式中的下一个内容,即 ...
    另一个\\. 匹配第二个.
    因为第一部分被括在括号 (\\..*?) 中,它被存储为 \1,所以替换模式 \\1_ 恢复第二个 . 之前的所有内容,第二个 . 被替换为 _

    【讨论】:

    • “额外的小细节”对 G5W 很有帮助
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      您可以将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"          
      

      【讨论】:

        猜你喜欢
        • 2021-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-20
        • 2020-07-10
        • 1970-01-01
        • 2022-10-07
        • 1970-01-01
        相关资源
        最近更新 更多