首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在未实现tidyselect帮助程序的函数中使用tidyselect帮助程序

在未实现tidyselect帮助程序的函数中使用tidyselect帮助程序
EN

Stack Overflow用户
提问于 2020-03-09 14:47:13
回答 1查看 127关注 0票数 2

如何在没有实现的函数中使用dplyr/tidyselect "select助手“(如: )来选择一系列的连续变量?

如果可能的话,以一种简单/优雅的方式(当然,这是主观的)。

下面是dplyr::distinct的一个例子,注意这个问题是通用的

代码语言:javascript
复制
library(dplyr)

mtcars %>% 
  distinct(vs:gear, 
           .keep_all = TRUE)
#> Warning in vs:gear: numerical expression has 32 elements: only the first used

#> Warning in vs:gear: numerical expression has 32 elements: only the first used
#> Error: Column `vs:gear` must be length 32 (the number of rows) or one, not 5

第一次尝试使用dplyr::select。我们能做得更好吗?

代码语言:javascript
复制
mtcars %>% 
  distinct(!!! syms(names(select(., vs:gear))),
           .keep_all = TRUE)
#>    mpg cyl  disp  hp drat    wt  qsec vs am gear carb
#> 1 21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
#> 2 22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
#> 3 21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
#> 4 18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
#> 5 24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
#> 6 26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2
#> 7 30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2

基于https://tidyselect.r-lib.org/articles/tidyselect.html的第二次尝试,实际上感觉更糟

代码语言:javascript
复制
# With tidyselect >= 1.0
mtcars %>% 
  distinct(!!! syms(names(tidyselect::eval_select(quote(vs:gear), .))),
           .keep_all = TRUE)
#>    mpg cyl  disp  hp drat    wt  qsec vs am gear carb
#> 1 21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
#> 2 22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
#> 3 21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
#> 4 18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
#> 5 24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
#> 6 26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2
#> 7 30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2

# Or equivalently
distinct2 <- function(.data, ..., .keep_all = FALSE) {
  expr <- rlang::expr(c(...))
  pos <- tidyselect::eval_select(expr, data = .data)
  dplyr::distinct(.data = .data, .keep_all = .keep_all,
                  !!! syms(names(pos)))
}
mtcars %>% 
  distinct2(vs:gear, .keep_all = TRUE)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-09 15:11:51

除了已经提到的distinct_at()之外,您还可以尝试:

代码语言:javascript
复制
mtcars %>%
 distinct(!!!select(., vs:gear), .keep_all = TRUE)

   mpg cyl  disp  hp drat    wt  qsec vs am gear carb
1 21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
2 22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
3 21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
4 18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
5 24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
6 26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2
7 30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60602969

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档