给以整数 r 结尾的列名加 1

Add 1 to column names that ends in integer r

我的问题很简单,我有一个包含很多列的数据框,其中一些以 q03b_ 开头,如下所示:

ID  ...  q03b_0 q03b_1 q03b_2 ... q03b_14
 1  ...    a      b      c           m

但我需要将列名更改为 q03b_other_1q03b_other_2q03b_other_3 等(从 1 而不是 0 开始计数)。我设法 select 带有 rename_at 的列并将“其他”添加到列名称中,如下所示:

df  %>% 
  rename_at(vars(matches('q03b_')), list(~ str_replace(., "b_(\d+)", "_other_\1")))

它带来了这样的数据框:

ID  ...  q03_other_0 q03_other_1 q03_other_2 ... q03_other_14
 1  ...    a               b          c               m

但我正在努力进入最后阶段,即:

ID  ...  q03_other_1 q03_other_2 q03_other_3 ... q03_other_15
 1  ...    a                b           c                m

我想我需要使用 as.numericas.character 的组合,但由于整洁的评估,我正在努力寻找一种方法来完成这项工作。有什么想法吗?

谢谢!

尝试以下操作:

library(tidyverse)

df <- data.frame(
  stringsAsFactors = FALSE,
                ID = c(1L),
            q03b_0 = c("a"),
            q03b_1 = c("b"),
            q03b_2 = c("c")
      )

names(df)[-1] <- names(df)[-1] %>% 
  str_remove("_.*") %>% 
  paste0("_other_",1:length(.))

df
#>   ID q03b_other_1 q03b_other_2 q03b_other_3
#> 1  1            a            b            c

编辑: 更通用的解决方案:

library(tidyverse)

df <- data.frame(
  stringsAsFactors = FALSE,
                ID = c(1L),
            q03b_0 = c("a"),
            q03b_1 = c("b"),
            q03b_2 = c("c")
      )

names(df)[str_detect(names(df), "^q03b_")] %<>% 
  str_split("_") %>% 
  map_chr(~ paste0(.x[1], "_other_", 1+as.numeric(.x[2])))

df 
#>   ID q03b_other_1 q03b_other_2 q03b_other_3
#> 1  1            a            b            c

gsubfn:

library(dplyr)
library(readr)
library(gsubfn)

df %>%
  rename_at(vars(matches('q03b_')), 
            list(~ gsubfn("b_\d+$", 
                          ~ paste0("_other_", 
                                   parse_number(x) + 1), 
                          .)))

输出

  q03_other_1 q03_other_2 q03_other_3
1           a           b           c

这是使用 sprintf 的替代方法:

library(dplyr)
library(stringr)
df %>% 
  select(-ID) %>% 
  rename_with(~str_replace(., "[0-9]+$", sprintf("%.0f", 1:length(colnames(df))))) %>% 
  rename_with(~str_replace(., "b", "")) %>% 
  bind_cols(ID=df$ID)
  q03_other_1 q03_other_2 q03_other_3 ID
1           a           b           c  1

我们也可以使用

library(dplyr)
library(stringr)
df %>% 
   rename_with(~ str_replace(., "b_\d+$", function(x)
     str_c('_other_', readr::parse_number(x) + 1)) , starts_with('q03b_'))
  ID q03_other_1 q03_other_2 q03_other_3
1  1           a           b           c

数据

df <- structure(list(ID = 1L, q03b_0 = "a", q03b_1 = "b", q03b_2 = "c"), class = "data.frame", row.names = c(NA, 
-1L))

我不确定您是否从原始列名称中获取数字,向其添加 +1 以创建新列。

不这样做也行得通 -

library(dplyr)

df %>%
  rename_with(~paste0('q03_other_', seq_along(.)), starts_with('q03b_'))

#  ID q03_other_1 q03_other_2 q03_other_3
#1  1           a           b           c

数据

df <- data.frame(ID = 1, q03b_0 = 'a', q03b_1 = 'b', q03b_2 = 'c')