问题描述
我想在将使用 dplyr::distinct()
的函数中指定未知数量的列名。我目前的尝试是:
myFunction <- function(table,id) {
table %>%
dplyr::distinct(.data[[id]])
}
我正在尝试上述 [.data[[id]]
],因为 the data-masking section of this dplyr blog 指出:
当你有一个字符向量的环境变量时,你需要用 [[ 索引到 .data 代词,比如 summarise(df,mean = mean(.data[[var]]))。>
dplyr::distinct()
的文档说明了它的第二个参数:
<data-masking>
确定唯一性时使用的可选变量。如果给定的输入组合有多行,则只会保留第一行。如果省略,将使用所有变量。
火花
更具体地说,我正在尝试将此函数与 Spark 结合使用。
sc <- sparklyr::spark_connect(local = "master")
mtcars_tbl <- sparklyr::copy_to(sc,mtcars,"mtcars_spark")
##### desired return
mtcars_tbl %>% dplyr::distinct(cyl,gear)
# Source: spark<?> [?? x 2]
cyl gear
<dbl> <dbl>
1 6 4
2 4 4
3 6 3
4 8 3
5 4 3
6 4 5
7 8 5
8 6 5
##### myFunction fails
id = c("cyl","gear")
myFunction(mtcars_tbl,id)
Error: Can't convert a call to a string
Run `rlang::last_error()` to see where the error occurred.
在 this comment 之后,我还有其他尝试失败:
myFunction <- function(table,id) {
table %>%
dplyr::distinct(.dots = id)
}
myFunction(mtcars_tbl,id)
# Source: spark<?> [?? x 1]
.dots
<list>
1 <named list [2]>
#####
myFunction <- function(table,id) {
table %>%
dplyr::distinct_(id)
}
myFunction(mtcars_tbl,id)
Error in UseMethod("distinct_") :
no applicable method for 'distinct_' applied to an object of class "c('tbl_spark','tbl_sql','tbl_lazy','tbl')"
解决方法
Distinct 一次应用于表的所有列。考虑一个示例表:
A B
1 4
1 4
2 3
2 3
3 3
3 5
目前尚不清楚将 distinct 应用于列 A 而不是列 B 应该返回什么。下面的例子显然不是一个好的选择,因为它打破了 A 列和 B 列之间的关系。例如,原始数据集中没有 (A = 2,B = 4) 行。
A B
1 4
2 4
3 3
3
3
5
因此,最好的方法是先只选择您想要的那些列,然后再选择不同的列。更像是:
myFunction <- function(table,id) {
table %>%
dplyr::select(dplyr::all_of(id)) %>%
dplyr::distinct()
}