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

使用列索引重命名多个列

  •  1
  • Earlien  · 技术社区  · 2 年前

    这是我的示例data.frame

    df <- tibble(
        ID = 1:3,
        col_x = LETTERS[1:3],
        col_q = letters[1:3],
        col_w = 3:1
    )
    
    > df
    # A tibble: 3 × 4
         ID col_x col_q col_w
      <int> <chr> <chr> <int>
    1     1 A     a         3
    2     2 B     b         2
    3     3 C     c         1
    

    我想通过附加列索引(不包括ID列)来重命名除ID列之外的所有列。所需输出:

         ID col_x1 col_q2 col_w3
      <int> <chr>  <chr>   <int>
    1     1 A      a           3
    2     2 B      b           2
    3     3 C      c           1
    

    (我会删除原件 x , q , w 在随后的步骤中)。我尝试过:

    df %>% rename_with(~paste0(.x, 1), .cols = -ID)               # Works
    df %>% rename_with(~paste0(.x, col_number()), .cols = -ID)    # Does nothing
    df %>% rename_with(~paste0(.x, col_number()-1), .cols = -ID)  # Error: non-numeric argument to binary operator
    

    我在写这篇文章的时候突然想到 col_number() 来自 readr 不像 row_number() 来自 dplyr -所以我在期待 col_number() 表现得像 row_number() 。既然如此,我如何在不必拼写中的每个密钥对的情况下实现这一点 rename ,例如。 rename(col_x1 = col_x, col_q2 = col_q, col_w3 = col_w) ?

    编辑 :

    df %>% rename_with(~paste0(.x, 1:3), .cols = -ID) 实现了我想要的,但列的数量不是固定的(可能超过3),因此需要一个动态解决方案。

    1 回复  |  直到 2 年前
        1
  •  2
  •   lroha    2 年前

    你可以做到:

    library(dplyr)
    
    df |>
      rename_with(\(x) paste0(x, seq_along(x)), -ID)
    
    # A tibble: 3 × 4
         ID col_x1 col_q2 col_w3
      <int> <chr>  <chr>   <int>
    1     1 A      a           3
    2     2 B      b           2
    3     3 C      c           1
    
    推荐文章