【问题标题】:Systematically rename column names using pre-existing name in R使用 R 中预先存在的名称系统地重命名列名
【发布时间】:2020-05-28 08:59:33
【问题描述】:

我有一个格式如下的数据框:

val1 = c(.35, .36, .35, .22, .27, .25)
val2 = c(.35, .35, .37, .40, .42, .46)
val3 = c(.88, .9, .87, .35, .35, .36)
val4 = c(.9, .91, .82, .36, .36, .36)
df = data.frame (val1, val2, val3, val4)
colnames(df)[1] = "group 1_31"
colnames(df)[2] = "group 1_32"
colnames(df)[3] = "group 2_32"
colnames(df)[4] = "group 10_310"

我知道这些列名不太理想,但不幸的是,它们是由我正在运行的程序自动提供的。我想重命名每一列,使组 a_bc 变为 bca,如下所示:

colnames(df)[1] = "311"
colnames(df)[2] = "321"
colnames(df)[3] = "322"
colnames(df)[4] = "31010"

我知道我可以通过以下方式摆脱“群体”:

colnames(df)=sub("group ","",colnames(df))

但这仍然给我留下了“1_31”、“1_32”等。

有没有办法在所有列名中自动将 a_bc 转换为 bca(我有 55 个需要这种转换)?

我已阅读Rename Dataframe Column Names in R using Previous Column Name and Regex Pattern,但我认为我的情况有所不同,因为我需要对现有列名重新排序,而不仅仅是在特定位置将它们切断。

【问题讨论】:

    标签: r dataframe rename col


    【解决方案1】:
    val1 = c(.35, .36, .35, .22, .27, .25)
    val2 = c(.35, .35, .37, .40, .42, .46)
    val3 = c(.88, .9, .87, .35, .35, .36)
    val4 = c(.9, .91, .82, .36, .36, .36)
    df = data.frame (val1, val2, val3, val4)
    colnames(df)[1] = "group 1_31"
    colnames(df)[2] = "group 1_32"
    colnames(df)[3] = "group 2_32"
    colnames(df)[4] = "group 10_310"
    
    gsub("^group (\\d+)_(\\d+)", "\\2\\1", colnames(df))
    [1] "311"   "321"   "322"   "31010"
    

    【讨论】:

      【解决方案2】:

      我们可以在作为一个组捕获后重新排列反向引用

      colnames(df) <- sub('group (\\d+)_(\\d+)', "\\2\\1", colnames(df))
      colnames(df)
      #[1] "311"   "321"   "322"   "31010"
      

      【讨论】:

      • 你能简单解释一下这是做什么的吗?在我看来:您使用第一个元素 (\\d+) 和 _ (\\d) 之后的第二个元素定义组。然后在更换子功能时,基本上你是说要切换位置。如果我输入 colnames(df3) = sub('group (\\d+)_(\\d+)', "\\3\\1", colnames(df3)) 怎么办?我得到 c(1,1,2,10)。为什么?谢谢
      • @Carlo 模式 match.ed 在 group 和空格之后 (`), capture one or more. digits inside brackets ((\\d+)) followed by _, then then second set of digits in capture grouop. In the replacement, we. switch the backreference in the reverse order i.e. 2nd followed by 1st (\\2\\1`)跨度>
      猜你喜欢
      • 2012-09-05
      • 2020-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-13
      相关资源
      最近更新 更多