使用类似select的机制为dplyr中的distinct调用选择变量

Kon*_*rad 5 r lazy-evaluation dplyr nse

期望的结果

使用简单的语法我过滤vsam列也留下cyl值.

data(mtcars)
dta <- mtcars[,c("vs", "am", "cyl")]
# Desired results
dta %>% distinct(vs, am, .keep_all = TRUE)
Run Code Online (Sandbox Code Playgroud)

期望的语法

我想颠倒上面的语法,并对cyl列之外的所有值选择不同的观察,对应于下面的示例:

dta %>% distinct(vars(-contains("cyl")), .keep_all = TRUE)
Run Code Online (Sandbox Code Playgroud)

这自然不起作用:

>> dta %>% distinct(vars(-contains("cyl")), .keep_all = TRUE)
   vs am cyl vars(-contains("cyl"))
1   0  1   6      ~-contains("cyl")
2   0  1   6      ~-contains("cyl")
3   1  1   4      ~-contains("cyl")
4   1  0   6      ~-contains("cyl")
5   0  0   8      ~-contains("cyl")
6   1  0   6      ~-contains("cyl")
7   0  0   8      ~-contains("cyl")
Run Code Online (Sandbox Code Playgroud)

Sot*_*tos 3

如果您不介意不使用distinct,那么您可以group_by_at与 一起使用slice来获得您想要的结果,即

library(dplyr)

dta %>% 
 group_by_at(vars(-cyl)) %>% 
 slice(1L)

# A tibble: 4 x 3
# Groups:   vs, am [4]
#     vs    am   cyl
#  <dbl> <dbl> <dbl>
#1     0     0     8
#2     0     1     6
#3     1     0     6
#4     1     1     4
Run Code Online (Sandbox Code Playgroud)