【问题标题】:Move characters from beginning of column name to end of column name将字符从列名的开头移动到列名的结尾
【发布时间】: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


    【解决方案1】:

    您可以使用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) &lt;- sub("([a-z])_([a-z]+)", "\\2_\\1", names(df))
    • 非常感谢 - 就是这样。我自己永远也想不通;这真的有助于我理解正则表达式。我很抱歉一开始不够清楚。
    【解决方案2】:

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

    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 日创建

    【讨论】:

    • 这个也是——它把我的数据框变成了一个“大字符”。
    • 查看 Chris 的评论/解决方案。此解决方案仅更改名称的值,但不分配它。查看更新...
    • 我也要感谢你——它帮助我了解如何创建一个小的示例数据框来帮助提出此类问题。
    • 总是乐于帮助并让某人开始做某事...... :) 请确保也投票/接受答案。这促使我们继续回答
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-12
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-26
    相关资源
    最近更新 更多