通过使用 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 %>% rename_with(~(ifelse(.x == "id", paste0("source_", .x), "id")))
,它也不起作用。
在这个特定的函数中,但更一般地说,这就是点所代表的。例如df %>% 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 列之外的所有列的主要内容,如果未能解决你的问题,请参考以下文章