伙计们,如何从列名中替换第二次出现的点?
示例数据:
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"
谢谢, Ĵ
答案 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"