给以整数 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_1
、q03b_other_2
、q03b_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.numeric
和 as.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')
我的问题很简单,我有一个包含很多列的数据框,其中一些以 q03b_
开头,如下所示:
ID ... q03b_0 q03b_1 q03b_2 ... q03b_14
1 ... a b c m
但我需要将列名更改为 q03b_other_1
、q03b_other_2
、q03b_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.numeric
和 as.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')