【发布时间】:2020-05-22 10:02:23
【问题描述】:
我有一个数据集,其中列名具有前缀(对应于面板波),例如
a_age
a_sex
a_jbstat
b_age
b_sex
b_jbstat
我想把前缀转换成后缀,这样就变成了:
age_a
sex_a
jbstat_a
age_b
sex_b
jbstat_b
我将不胜感激有关执行此操作的有效方法的建议。
【问题讨论】:
标签: r columnname
我有一个数据集,其中列名具有前缀(对应于面板波),例如
a_age
a_sex
a_jbstat
b_age
b_sex
b_jbstat
我想把前缀转换成后缀,这样就变成了:
age_a
sex_a
jbstat_a
age_b
sex_b
jbstat_b
我将不胜感激有关执行此操作的有效方法的建议。
【问题讨论】:
标签: r columnname
您可以使用sub 和反向引用:
sub("([a-z])_([a-z]+)", "\\2_\\1", x)
[1] "age_a" "sex_a" "jbstat_a" "age_b" "sex_b" "jbstat_b"
反向引用\\1和\\2调用两个捕获组([a-z])中的确切字符串,\\1调用,([a-z]+)调用\\2。要获得所需的字符串更改,只需将这些“回忆”在替换参数中反转为 sub。
编辑:
如果元素是列名,你可以这样做:
names(df) <- sub("([a-z])_([a-z]+)", "\\2_\\1", names(df))
【讨论】:
names(df) <- sub("([a-z])_([a-z]+)", "\\2_\\1", names(df))
一种方法是使用正则表达式
x <- c(
"a_age",
"a_sex",
"a_jbstat",
"b_age",
"b_sex",
"b_jbstat"
)
stringr::str_replace(x, "^([a-z]+)_([a-z]+)$", "\\2_\\1")
#> [1] "age_a" "sex_a" "jbstat_a" "age_b" "sex_b" "jbstat_b"
由reprex package (v0.3.0) 于 2020-05-25 创建
df <- data.frame(
a_age = 1,
a_sex = 1,
b_age = 2,
b_sex = 2
)
df
#> a_age a_sex b_age b_sex
#> 1 1 1 2 2
names(df) <- stringr::str_replace(names(df), "^([a-z]+)_([a-z]+)$", "\\2_\\1")
df
#> age_a sex_a age_b sex_b
#> 1 1 1 2 2
由reprex package (v0.3.0) 于 2020 年 5 月 26 日创建
【讨论】: