【问题标题】:In R, how do I add a string of text to column names?在 R 中,如何将一串文本添加到列名?
【发布时间】:2021-12-15 10:56:21
【问题描述】:

我想在数据框中的列名末尾添加一串文本。我该怎么做?

示例数据(我想将列名 ABCDE 更改为 AtextBtextCtextDtext、@ 987654330@):

df <- structure(list(User_ID = 1:4, A = c(0.815353067, 0.698314902, 0.774619233, 0.949620322),
                      B = c(0.684046246, 0.427028078, 0.579449798, 0.977426626),
                      C = c(0.101562005, 0.943064479, 0.19946195, 0.70068721),
                      D = c(0.525384365, 0.638082727, 0.651924335, 0.112375646), 
                      E = c(0.415664129, 0.006406548, 0.85036104, 0.510504667)),
                class = "data.frame", row.names = c(NA, -4L))

【问题讨论】:

    标签: r string rename


    【解决方案1】:

    使用grep 查找字母名称列,并使用paste 将字符串text 连接到末尾:

    names.change <- grep("^[A-Z]+$", names(df))
    names(df)[names.change] <- paste0(names(df)[names.change], "text")
    df
    
      User_ID     Atext     Btext     Ctext     Dtext       Etext
    1       1 0.8153531 0.6840462 0.1015620 0.5253844 0.415664129
    2       2 0.6983149 0.4270281 0.9430645 0.6380827 0.006406548
    3       3 0.7746192 0.5794498 0.1994619 0.6519243 0.850361040
    4       4 0.9496203 0.9774266 0.7006872 0.1123756 0.510504667
    

    【讨论】:

    • 啊,我明白了。这是我 24 小时内第二次需要正则表达式,这是我以前从未遇到过的。我花了很长时间才为看似如此简单的事情找到解决方案(但我一无所获)。非常感谢!
    • @aspark2020 您在这里不一定需要正则表达式。例如,如果您知道数据框中AB 等列的数字索引,则可以简单地进行子集化。我以为你不知道这一点,所以我使用了更通用的方法 grep
    • 没错,但我喜欢你的解决方案更通用的事实。
    【解决方案2】:

    我更喜欢它与dplyr::rename_with

    library(dplyr)
    
    df %>% rename_with(~paste0(., "Text"), grep("^[A-Z]$", names(.)))
    

    输出:

      User_ID     AText     BText     CText     DText       EText
    1       1 0.8153531 0.6840462 0.1015620 0.5253844 0.415664129
    2       2 0.6983149 0.4270281 0.9430645 0.6380827 0.006406548
    3       3 0.7746192 0.5794498 0.1994619 0.6519243 0.850361040
    4       4 0.9496203 0.9774266 0.7006872 0.1123756 0.510504667
    

    【讨论】:

    • @U12-Forward:友情提示:这里是rename_with的建议,因为rename_at已被取代dplyr.tidyverse.org/reference/select_all.html>library(dplyr) rename_with(df, ~paste0("text", .), 2:6)
    【解决方案3】:

    这是一个没有grepl 的基本 R 解决方案:

    colnames(df)[-1] <- paste0(colnames(df)[-1], "text")
    

    输出:

      User_ID     Atext     Btext     Ctext     Dtext       Etext
    1       1 0.8153531 0.6840462 0.1015620 0.5253844 0.415664129
    2       2 0.6983149 0.4270281 0.9430645 0.6380827 0.006406548
    3       3 0.7746192 0.5794498 0.1994619 0.6519243 0.850361040
    4       4 0.9496203 0.9774266 0.7006872 0.1123756 0.510504667
    

    【讨论】:

      【解决方案4】:

      我也会使用rename_with。但我认为我们可以使用.cols 参数,因此我们可以在调用rename_with 之前包含一个选择助手,从而消除对grep 的需要。

      df %>% rename_with(.cols=matches('[A-E]'), ~paste0(.x, 'text'))
      

      如果选择的列始终是 A-Z,则选择可以更简单:

      df %>% rename_with(~paste0(.x, 'text'), A:E)
      

      输出

        User_ID     Atext     Btext     Ctext     Dtext       Etext
      1       1 0.8153531 0.6840462 0.1015620 0.5253844 0.415664129
      2       2 0.6983149 0.4270281 0.9430645 0.6380827 0.006406548
      3       3 0.7746192 0.5794498 0.1994619 0.6519243 0.850361040
      4       4 0.9496203 0.9774266 0.7006872 0.1123756 0.510504667
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-09-16
        • 2022-12-18
        • 2020-01-14
        • 1970-01-01
        • 1970-01-01
        • 2014-02-12
        • 1970-01-01
        相关资源
        最近更新 更多