首页 > 解决方案 > 将模式添加到与另一个模式匹配的列名

问题描述

我想在名为“再见”的列中添加“好”。

df <- tibble("hi" = c(1,2,3), "bye1" = c(1,2,3), "bye2" = c(1,2,3))
df
# A tibble: 3 x 3
     hi  bye1  bye2
  <dbl> <dbl> <dbl>
1     1     1     1
2     2     2     2
3     3     3     3

在这里我可以使用:

colnames(df)[2:3] <- c("goodbye1", "goodbye2")

但我的真实情况是 df 有几百列,打字太多了。所以我想寻找模式“再见”并为所有这些添加一个“好”。我试过这个:

colnames(df[ , grepl("bye", names(df))])
[1] "bye1" "bye2"

paste0("good", colnames_bye)
[1] "goodbye1" "goodbye2"

但结合起来像

colnames(df[ , grepl("bye", names(df))]) <- paste0("good", colnames_bye)

什么都不给。没有警告,没有错误,没有变化。R 只是忽略该命令。我究竟做错了什么?

标签: r

解决方案


您的代码的问题是在这种情况下

colnames(df[ , grepl("bye", names(df))])

是一个创建、更新和未签名的新对象。

而不是创建一个新对象,您应该只更新 colnames(df) 的一个子集。查看使用 ( )[ ] 代码而不是 ( [ ] ) 时的区别。

colnames(df)[grepl("bye", names(df))] <- paste0("good", colnames(df)[grepl("bye", names(df))] )

给,

     hi goodbye1 goodbye2
  <dbl>    <dbl>    <dbl>
1     1        1        1
2     2        2        2
3     3        3        3

推荐阅读