R语言 复制名称后缀为数字的列,并向新列名后缀添加偏移量

jchrr9hc  于 2023-01-06  发布在  其他
关注(0)|答案(2)|浏览(139)

我想复制一个列的子集,这些列的名字后面都有数字。新列的数字后缀应该加上一个特定的偏移量(在下面的例子中是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="_"))
  )
)
ahy6op9u

ahy6op9u1#

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)}"
))
disho6za

disho6za2#

这适用于给定的示例,使用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}"))

相关问题