通过使用 dplyr 添加前缀重命名除 id 列之外的所有列

Posted

技术标签:

【中文标题】通过使用 dplyr 添加前缀重命名除 id 列之外的所有列【英文标题】:Rename all columns except id column by adding a prefix using dplyr 【发布时间】:2021-06-17 04:54:25 【问题描述】:

我有一个数据框,其列 id、feature_1、feature_2、feature_3 如下所示。

df = data.frame(
  id = sample(letters, 5),
  feature_1 = sample(1:10, 5),
  feature_2 = runif(5),
  feature_3 = rnorm(5)
)

我想通过添加前缀来重命名所有特征列。以下行不起作用并输出错误。

df %>%
  rename_with(~(ifelse(names(.x) == "id", paste0("source_", names(.x)), "id")))

Error in names[cols] <- .fn(names[cols], ...) : 
  replacement has length zero

关于如何修改它的任何提示? .x 在 rename_with 中代表什么?提前致谢!

【问题讨论】:

【参考方案1】:
library(dplyr)

df %>% 
  dplyr::rename_with(~ paste0("source_", .), -id)

rename_with 的第三个参数是.cols,您可以在其中使用tidyselect 语法来选择列。这里-id 不包括此列。


对于 cmets,. 语法比编写匿名函数更简洁/更简单,但您可以等效地完成此操作:

df %>% 
  dplyr::rename_with(function(x) paste0("source_", x), -id)

【讨论】:

感谢LMc! rename_with 中的点代表什么?我注意到一些 dplyr 函数使用 dot 而其他一些函数使用 .x。它们之间有什么区别? 点语法是指应用函数的列。 ..x 将被识别为此引用。 对于rename_with,点好像代表列名?如果我将命令更改为df %&gt;% rename_with(~(ifelse(.x == "id", paste0("source_", .x), "id"))),它也不起作用。 在这个特定的函数中,但更一般地说,这就是点所代表的。例如df %&gt;% mutate(across(starts_with("feature"), ~ . + 1)) 点不代表列名。【参考方案2】:
names(df) <- paste0("Source_", names(df))

这是解决方案的模型。要将修改应用于名称子集,请使用索引,如

i <- grep("feature", names(df))
names(df)[i] <-  paste0("Source_", names(df)[i])

这里,i 是要修改的名称的索引数组。它的创建方式无关紧要,但当标准基于名称本身时,grep 是一种很好的方法。

【讨论】:

谢谢胡伯!我很好奇 dplyr 中使用管道格式 r 代码的实现以及在 rename_with 函数中传递的 .x 的功能。 这似乎(充其量)是一种迂回的方式来做一些简单且直接在基础 R 中支持的事情。

以上是关于通过使用 dplyr 添加前缀重命名除 id 列之外的所有列的主要内容,如果未能解决你的问题,请参考以下文章

dplyr 重命名“找不到对象”[关闭]

R语言dplyr包通过数据列的索引重命名数据列实战(Rename Column by Index Position)

工具收集 - 重命名工具 ReNamer

设置 Kafka Connect,无法重命名组 ID

文件重命名时快速添加时间前缀

COM Interop的重命名/前缀类