【发布时间】: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>
通常我会使用gsub 和set_names 来获取项目编号并构造新名称。像这样:
df %>%
set_names(gsub("p([0-9]{1,2})|BNT([0-9]{1,2})", "BOS_\\1\\2_cod", names(.)))
这样,我可以重新使用原始名称中的相关数字。问题是,由于我们用于导出响应的软件,时间列通常有一个不是从 01 开始的计数,所以我不能重复使用这个计数。相反,我必须只选择时间列并使用colnames 和paste0 来构造名称,然后重新加入时间列。像这样:
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 列是问题。
【问题讨论】:
-
你能显示预期的字符串吗
-
最好的方法是开发一个脚本来整理你的数据,这样你的列名中就不会包含变量。不过,目前还很难理解,所以我不完全确定理想情况下会是什么样子。