将字符从列名的开头移动到列名的结尾

Move characters from beginning of column name to end of column name

我有一个数据集,其中列名有前缀(对应于面板波),例如

a_age
a_sex
a_jbstat
b_age
b_sex
b_jbstat

我想将前缀转换成后缀,这样就变成了:

age_a
sex_a
jbstat_a
age_b
sex_b
jbstat_b

如果您能就有效的方法提出建议,我将不胜感激。

一种方法是使用正则表达式

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-05-26 创建

您可以使用 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 回忆。为了获得所需的字符串更改,这些 'recollections' 在 sub.

的替换参数中简单地反转

编辑:

如果元素是列名,你可以这样做:

names(df) <- sub("([a-z])_([a-z]+)", "\2_\1", names(df))