r - 如何使用定标将命名向量传递给dplyr::select?

标签 r dplyr nse rlang

使用旧的select_()函数,我可以将命名向量传递给select并立即更改位置和列名称:

my_data  <- data_frame(foo = 0:10, bar = 10:20, meh = 20:30)
my_newnames  <-  c("newbar" = "bar", "newfoo" = "foo")

move_stuff  <- function(df, newnames) {
    select_(df, .dots = newnames)
}

move_stuff(my_data,  newnames = my_newnames) )

# this is the desired output
# A tibble: 4 x 2
  newbar  newfoo
   <int>   <int>
1     10       0
2     11       1
3     12       2
4     13       3

我尝试使用quasure和splicing做类似的事情-选择列效果很好,但是向量的名称(因此同时重命名列)似乎被忽略了。以下两个返回的数据帧均带有名为barfoo的列,但没有返回newbarnewfoo的列:
move_stuff2  <- function(df, newnames) {
  select(df, !!!newnames)
}

# returns df with columns bar and foo
move_stuff2(my_data, quo(my_newnames))
move_stuff2(my_data, quos(my_newnames))

有没有办法使用新的NSE方法使用命名向量来对列进行重命名和重新排序?

最佳答案

quo(或quos为多个)用于未加引号的变量名,而不是字符串。要将字符串转换为quosure,请使用sym(或syms),并根据需要使用!!!!!取消引用或取消引用拼接:

library(dplyr)

my_data  <- data_frame(foo = 0:10, bar = 10:20, meh = 20:30)
my_newnames  <-  c("newbar" = "bar", "newfoo" = "foo")

对于字符串,

move_stuff_se <- function(df, ...){
     df %>% select(!!!rlang::syms(...))
}

move_stuff_se(my_data, my_newnames)
#> # A tibble: 11 x 2
#>    newbar newfoo
#>     <int>  <int>
#>  1     10      0
#>  2     11      1
#>  3     12      2
#>  4     13      3
#>  5     14      4
#>  6     15      5
#>  7     16      6
#>  8     17      7
#>  9     18      8
#> 10     19      9
#> 11     20     10

对于未加引号的变量名,

move_stuff_nse <- function(df, ...){
    df %>% select(!!!quos(...))
}

move_stuff_nse(my_data, newbar = bar, newfoo = foo)
#> # A tibble: 11 x 2
#>    newbar newfoo
#>     <int>  <int>
#>  1     10      0
#>  2     11      1
#>  3     12      2
#>  4     13      3
#>  5     14      4
#>  6     15      5
#>  7     16      6
#>  8     17      7
#>  9     18      8
#> 10     19      9
#> 11     20     10

关于r - 如何使用定标将命名向量传递给dplyr::select?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44656993/

相关文章:

r - 如何将摘要输出转换为数据框?

r - Str_detect 多列使用跨

r - 在 tidyverse 中,类 "tbl"和 "tbl_df"的对象有什么区别?

r - 如何获取在指定环境中评估调用对象时使用的所有参数的值

r - dplyr 使用可变列进行变异

r - 如何在ggplot2上的文本框标签和数据点之间绘制连接线?

r - 如何反转R中的数字

r - R中列数可变的排序矩阵

r - 将用户规范作为参数传递给 Shiny 中的 dplyr

r - ggplot 函数内 aes(...) 中变量的范围