R语言 使用数字说明重命名非连续列名

kt06eoxx  于 2023-01-28  发布在  其他
关注(0)|答案(3)|浏览(139)

我有这样一个数据:

library(tidyverse)
dat <- cars %>%
  t() %>%
  as_tibble()
dat <- dat %>%
  rename(dummy = V10)
dat
# A tibble: 2 × 50
     V1    V2    V3    V4    V5    V6    V7    V8    V9 dummy   V11   V12   V13
  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1     4     4     7     7     8     9    10    10    10    11    11    12    12
2     2    10     4    22    16    10    18    26    34    17    28    14    20
# … with 37 more variables: V14 <dbl>, V15 <dbl>, V16 <dbl>, V17 <dbl>, V18 <dbl>,
#   V19 <dbl>, V20 <dbl>, V21 <dbl>, V22 <dbl>, V23 <dbl>, V24 <dbl>, V25 <dbl>,
#   V26 <dbl>, V27 <dbl>, V28 <dbl>, V29 <dbl>, V30 <dbl>, V31 <dbl>, V32 <dbl>,
#   V33 <dbl>, V34 <dbl>, V35 <dbl>, V36 <dbl>, V37 <dbl>, V38 <dbl>, V39 <dbl>,
#   V40 <dbl>, V41 <dbl>, V42 <dbl>, V43 <dbl>, V44 <dbl>, V45 <dbl>, V46 <dbl>,
#   V47 <dbl>, V48 <dbl>, V49 <dbl>, V50 <dbl>
# ℹ Use `colnames()` to see all variable names

我希望列名为**"V8,V9,dummy,* V10 V11 *..."如何通过操作列名来实现这一点?我想知道是否可以使用dplyr::rename_with来实现这一点,但我不确定如何编写它。
任何帮助都将不胜感激,谢谢你提前。
编辑:我想知道是否有一种方法可以做到这一点
而不依赖于列号(例如,dat [10:49])来指定要重命名的列,**因为实际数据要大得多,我必须对多个系列的项目进行重命名。谢谢Jon Spring指出这一点。

vecaoik1

vecaoik11#

使用regmatches及其替换模式:

rg <- regexpr("\\d+", names(dat))
regmatches(names(dat), rg) <- seq_along(rg)
dat
## A tibble: 2 × 50
#     V1    V2    V3    V4    V5    V6    V7    V8    V9 dummy   V10   V11   V12
#  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#...
wgxvkvu9

wgxvkvu92#

这应该与编号无关,但它取决于要使用'dummy'重命名的列的名称:此解决方案使用rename_with以及appendmatch函数。基本上,我们使用match获取"V9"的索引,然后使用append将其添加到该索引后的列名向量中:

library(dplyr)
cars %>%
  t() %>%
  as_tibble() %>% 
  rename_with(., ~append(colnames(dat), "dummy", after = match("V9", colnames(dat))))
[1] "V1"    "V2"    "V3"    "V4"    "V5"    "V6"    "V7"    "V8"    "V9"    "dummy" "V10"   "V11"   "V12"   "V13"   "V14"   "V15"  
[17] "V16"   "V17"   "V18"   "V19"   "V20"   "V21"   "V22"   "V23"   "V24"   "V25"   "V26"   "V27"   "V28"   "V29"   "V30"   "V31"  
[33] "V32"   "V33"   "V34"   "V35"   "V36"   "V37"   "V38"   "V39"   "V40"   "V41"   "V42"   "V43"   "V44"   "V45"   "V46"   "V47"  
[49] "V48"   "V49"
x8diyxa7

x8diyxa73#

dat_names <- names(dat)
names(dat) = c(dat_names[1:9], "dummy", dat_names[10:49])

或者,如果您不知道要替换的列在哪个列位置,但知道它的名称:

dat_names <- names(dat)
col <- match("V10", dat_names)
names(dat) = c(dat_names[1:(col-1)], "dummy", 
               dat_names[(col+1):length(dat_names)])

相关问题