【问题标题】:Rename selected columns with a vector of strings使用字符串向量重命名选定列
【发布时间】:2017-06-18 03:35:20
【问题描述】:

我需要重命名几个名称具有字符串模式的列。让我们以这个数据框为例。

library(tidyverse, tibble)

df = as.tibble(matrix(0, nrow = 3, ncol = 30))

colnames(df) = c("p1", "BNT2", "BNT3", "BNT4","BNT5","BNT6","BNT7","BNT8","BNT9","BNT10",
                 "BNT11","BNT12","BNT13","BNT14" ,"BNT15", "groupTime186", "groupTime187", "groupTime188", "groupTime189", "groupTime190", "groupTime191", 
                 "groupTime192", "groupTime193", "groupTime194", "groupTime195" ,"groupTime196", "groupTime197", 
                 "groupTime198", "groupTime199", "groupTime200")

# A tibble: 3 x 30
     p1  BNT2  BNT3  BNT4  BNT5  BNT6  BNT7  BNT8  BNT9 BNT10 BNT11 BNT12 BNT13 BNT14 BNT15 groupTime186 groupTime187 groupTime188
  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>        <dbl>        <dbl>        <dbl>
1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0            0            0            0
2     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0            0            0            0
3     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0            0            0            0
# ... with 12 more variables: groupTime189 <dbl>, groupTime190 <dbl>, groupTime191 <dbl>, groupTime192 <dbl>, groupTime193 <dbl>,
#   groupTime194 <dbl>, groupTime195 <dbl>, groupTime196 <dbl>, groupTime197 <dbl>, groupTime198 <dbl>, groupTime199 <dbl>,
#   groupTime200 <dbl>

通常我会使用gsubset_names 来获取项目编号并构造新名称。像这样:

df %>% 
  set_names(gsub("p([0-9]{1,2})|BNT([0-9]{1,2})", "BOS_\\1\\2_cod", names(.)))

这样,我可以重新使用原始名称中的相关数字。问题是,由于我们用于导出响应的软件,时间列通常有一个不是从 01 开始的计数,所以我不能重复使用这个计数。相反,我必须只选择时间列并使用colnamespaste0 来构造名称,然后重新加入时间列。像这样:

colnames(df) = paste0("BOS_", sprintf("%02d", 1:15), "_time")

我不认为这是处理此任务的好方法,因为需要更多步骤,并且它没有嵌入到重命名答案列的原始管道代码中。

我的问题是:我如何选择要重命名的列并使用包含新名称的向量来提供它们? 或者,我可以使用序列,例如 @987654329 @,所以gsub 将第一列替换为序列的第一项? 理想情况下,我想要一个可以嵌入管道代码(dplyr)的解决方案。

更新:预期的输出是相同的数据帧,但以这种方式命名:

 [1] "BOS_01_raw"  "BOS_02_raw"  "BOS_03_raw"  "BOS_04_raw"  "BOS_05_raw"  "BOS_06_raw"  "BOS_07_raw"  "BOS_08_raw"  "BOS_09_raw"  "BOS_10_raw" 
[11] "BOS_11_raw"  "BOS_12_raw"  "BOS_13_raw"  "BOS_14_raw"  "BOS_15_raw"  "BOS_01_time" "BOS_02_time" "BOS_03_time" "BOS_04_time" "BOS_05_time"
[21] "BOS_06_time" "BOS_07_time" "BOS_08_time" "BOS_09_time" "BOS_10_time" "BOS_11_time" "BOS_12_time" "BOS_13_time" "BOS_14_time" "BOS_15_time"

正如我之前所说,我可以重命名 BNT 项目,因为它们已经被编号,但是 groupTime 列是问题。

【问题讨论】:

  • 你能显示预期的字符串吗
  • 最好的方法是开发一个脚本来整理你的数据,这样你的列名中就不会包含变量。不过,目前还很难理解,所以我不完全确定理想情况下会是什么样子。

标签: r dplyr


【解决方案1】:

感谢@mt1022 的评论,我设法解决了这个问题。根据How to rename multiple columns given character vectors of column names and replacement in dplyr 0.6.0?

首先必须创建一个具有新名称的向量。

names_boston =  c(paste0("BOS_", sprintf("%02d", 1:31), "_time"))

然后可以使用grep 选择列,并将新名称提供给rename_at

df %>%
rename_at(vars(grep("Time", names(.))), ~names_boston)

为了避免创建新向量,您实际上可以将向量提供给前一行代码:

df %>%
    rename_at(vars(grep("Time", names(.))), ~c(paste0("BOS_", sprintf("%02d", 1:31), "_time")))

【讨论】:

    猜你喜欢
    • 2017-11-11
    • 2016-07-30
    • 2023-03-10
    • 1970-01-01
    • 2021-08-02
    • 2012-08-06
    • 2015-08-03
    • 2017-09-26
    • 1970-01-01
    相关资源
    最近更新 更多