【问题标题】:Enter new column names as string in dplyr's rename function在 dplyr 的重命名函数中输入新的列名作为字符串
【发布时间】:2014-12-15 17:16:19
【问题描述】:

dplyr 的重命名函数要求将新列名作为不带引号的变量名传入。但是我有一个函数,其中列名是通过将字符串粘贴到传入的参数上来构造的,字符串也是如此。

比如说我有这个功能

myFunc <- function(df, col){
  new <- paste0(col, '_1')
  out <- dplyr::rename(df, new = old)
  return(out)
}

如果我运行这个

df <- data.frame(a = 1:3, old = 4:6)
myFunc(df, 'x')

我明白了

  a new
1 1   4
2 2   5
3 3   6

而我希望“新”列是我构造的字符串的名称(“x_1”),即

  a x_1
1 1   4
2 2   5
3 3   6

有没有办法做到这一点?

【问题讨论】:

  • 来自announcement of dplyr 0.3:“您现在可以使用dplyr 进行编程 - 每个使用非标准评估 (NSE) 的函数还有一个以 _ 结尾的标准评估 (SE) 双胞胎[...] 每个函数的 SE 版本都有类似的参数,但必须明确地“引用”它们。”因此,请检查rename_ 在这里是否有用。
  • 谢谢,知道这很有用,但在这种情况下它实际上并没有改变任何东西。如果我传入的列是旧的列名,它会起作用,但是将上述函数更改为使用 rename_ (并将 old 放在引号中)仍然返回相同的
  • @user1165199 我会做colnames(df)[colnames(df) %in% "old"] &lt;- paste0("x","_")(如果有必要,在函数中),因为它能够轻松替换名称向量。
  • 谢谢akrun,这就是我最后所做的。只是希望有一种使用现有函数的更简洁的方法。
  • 我想向所有列名发送一个串联列表。 df ` new &lt;- c("a.new", "b.new") %>% names(.) &lt;- rename_(new)

标签: r dplyr


【解决方案1】:

我想这就是你要找的。正如@Henrik 建议的那样,它是rename_ 的使用,但参数有一个,可以说,有趣的名字:

> myFunc <- function(df, col){
+   new <- paste0(col, '_1')
+   out <- dplyr::rename_(df, .dots=setNames(list(col), new))
+   return(out)
+ }
> myFunc(data.frame(x=c(1,2,3)), "x")
  x_1
1   1
2   2
3   3
>

注意使用setNames 来使用new 的值作为列表中的名称。

【讨论】:

  • 我不确定list(col) 想要做什么。如果你只是做.dots=setNames(col, new),你的例子仍然有效。如果你有多个要重命名的列,list() 会导致问题,因为length(list(col)) != length(new)
  • 现在已弃用。使用当前的“整洁评估”如何实现这一点?
【解决方案2】:

最近对tidyrdplyr 的更新允许您使用rename_with 函数。

假设你有一个数据框:

library(tidyverse)

df <- tibble(V0 = runif(10), V1 = runif(10), V2 = runif(10), key=letters[1:10])

并且您想更改所有“V”列。通常,我对此类列的引用来自一个 json 文件,该文件在 R 中是一个带标签的列表。例如,

colmapping <- c("newcol1", "newcol2", "newcol3")
names(colmapping) <- paste0("V",0:2)

然后您可以使用以下命令将df 的名称更改为colmapping 列表中的字符串:

df <- rename_with(.data = df, .cols = starts_with("V"), .fn = function(x){colmapping[x]})

【讨论】:

    猜你喜欢
    • 2023-03-10
    • 2015-08-03
    • 1970-01-01
    • 2014-02-11
    • 2015-03-08
    • 2018-01-20
    • 1970-01-01
    • 2021-05-19
    • 2020-09-19
    相关资源
    最近更新 更多