我需要重命名几个名称具有字符串模式的列。我们以此数据框为例。
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")
我不相信这是一个很好的方法来处理这个任务,因为需要更多的步骤而且它没有嵌入到重命名答案列的原始管道代码中。
我的问题是:如何选择要重命名的列并使用包含新名称的向量提供它们?或者,我可以使用序列,例如{{ 1}},所以sprintf("%02d", 1:15)
用序列的第一个术语替换第一列?理想情况下,我想要一个可嵌入管道代码(gsub
)的解决方案。
更新:预期输出是相同的数据帧,但以这种方式命名:
dplyr
正如我之前所说,我可以重命名BNT项目,因为它们已经被编号,但是groupTime列是问题所在。
答案 0 :(得分:3)
由于@ mt1022评论,我设法解决了这个问题。根据{{3}}:
首先必须创建一个包含新名称的矢量。
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")))