【问题标题】:Rename all columns except id column by adding a prefix using dplyr通过使用 dplyr 添加前缀重命名除 id 列之外的所有列
【发布时间】: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 中代表什么?提前致谢!

【问题讨论】:

    标签: r dplyr rename


    【解决方案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 中支持的事情。
    猜你喜欢
    • 1970-01-01
    • 2021-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-05
    • 1970-01-01
    • 2016-12-29
    • 2013-01-30
    相关资源
    最近更新 更多