代码之家  ›  专栏  ›  技术社区  ›  Shaun

使用dplyr更改以数字作为名称的列

  •  0
  • Shaun  · 技术社区  · 1 周前

    在数据帧中,我有两列(名称是数字,因为表是数据透视图的结果)。我希望能够使用这些列使用mutate,但它无法使其工作。 这是数据。

    df <- structure(list(Age_Band = c("20-30", "20-30", "30-40", "30-40", 
                                      "40-50", "40-50", "50-60", "50-60"), Gender = c("female", "male", 
                                                                                      "female", "male", "female", "male", "female", "male"), `2012` = c(20881.9, 
                                                                                                                                                        19962.1, 29710.85, 26187.4, 50536.05, 21359.3, 26447.65, 24520.95
                                                                                      ), `2013` = c(20132.4, 17268.15, 22622.1, 21543.05, 39569.15, 
                                                                                                    15701.1, 21450.95, 21020.6)), class = c("tbl_df", "tbl", "data.frame"
                                                                                                    ), row.names = c(NA, -8L))
    

    这是我试图运行的代码。创建具有差异的新列。

    df %>%
      mutate(difference = 2013 - 2012)
    

    我想这行不通,因为列名是数字?还有别的办法吗?否则,有办法在dplyr中重命名它们,因为我也找不到方法。非常感谢您的帮助。谢谢

    1 回复  |  直到 1 周前
        1
  •  1
  •   Andre Wildberg    1 周前

    我建议重命名它们,例如使用 rename_with (或者,如果可以的话,一开始就避免创建它们)

    library(dplyr)
    
    df %>% 
      rename_with(~ if_else(grepl("^\\d+$", .x), paste0("var", .x), .x))
    # A tibble: 8 × 4
      Age_Band Gender var2012 var2013
      <chr>    <chr>    <dbl>   <dbl>
    1 20-30    female  20882.  20132.
    2 20-30    male    19962.  17268.
    3 30-40    female  29711.  22622.
    4 30-40    male    26187.  21543.
    5 40-50    female  50536.  39569.
    6 40-50    male    21359.  15701.
    7 50-60    female  26448.  21451.
    8 50-60    male    24521.  21021.
    

    只是 sub 也有效

    df %>%
      rename_with(~ sub("^(\\d+)$", "var\\1", .x))
    

    如果必须使用这些数字,请使用将其视为符号进行访问

    • 回溯`2012`
    • eval(as.name("2012"))
    • !!sym("2012")