【问题标题】:Duplicating columns whose names are suffixed with numbers and adding an offset to the new column name suffixes复制名称后缀为数字的列并向新列名称后缀添加偏移量
【发布时间】:2023-01-05 15:33:35
【问题描述】:

我想复制名称以数字为后缀的列的某个子集。新列的数字后缀应添加一定的偏移量(在以下示例中为 12)。

源数据框:

所需的数据框:

不幸的是,我的代码根本无法正常工作,而且看起来复杂得不合理。

library(tidyverse)

df <- data.frame(
  v_1 = c('Aira', 'Ben', 'Cat'),
  v_2 = c(23, 32, 27),
  v_3 = c(90, 98, 95)
)

# Duplicate columns using mutate + across
df2 <- df %>% mutate(
  across(
    .cols = starts_with('v'),
   .names = paste("x", toString(strtoi(strsplit({.col}, '_')[[1]][2]) + 12, sep="_"))
  )
)

【问题讨论】:

    标签: r tidyverse reshape


    【解决方案1】:
    bind_cols(
      df, 
      df %>% rename_with(
        .cols=starts_with("v_"),
        .fn=(x) paste0("v_",as.numeric(stringr::str_extract_all(x,"\d"))+12)
      )
    )
    

    您也可以按照计划使用 mutate(across()),如下所示:

    df %>% mutate(across(
      .cols=starts_with("v_"),
      .names="{paste0('v_',as.numeric(stringr::str_extract(col,'\\d'))+12)}"
    ))
    

    【讨论】:

      【解决方案2】:

      这适用于给定的示例,使用dplyr::across()

      df %>% 
          dplyr::mutate(across(v_1:v_3, 
                               .fns = ~ .x, 
                               .names = "x_{as.numeric(stringr::str_sub(.col, 3, 3))+12}"))
      
         v_1 v_2 v_3 x_13 x_14 x_15
      1 Aira  23  90 Aira   23   90
      2  Ben  32  98  Ben   32   98
      3  Cat  27  95  Cat   27   95
      

      编辑

      使用正则表达式提取一个或多个数字的字符串结尾:

      df %>% 
          dplyr::mutate(across(v_1:v_3, 
                               .fns = ~ .x, 
                               .names = "x_{as.numeric(stringr::str_extract(.col, pattern = '[0-9]+$'))+12}"))
      

      【讨论】:

      • 我说得对吗:您的代码不适用于数字后缀超过一位的变量?我的示例数据集只是一个简化版本,原始版本最多有 3 位数字……
      • @Madamadam 我做了并编辑了应该适合你的答案
      猜你喜欢
      • 2020-11-24
      • 2015-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-07
      • 2021-05-29
      • 1970-01-01
      相关资源
      最近更新 更多