R 如何将列名称的tidyselect样式列表拼接到my函数的调用中
我正在尝试编写一个函数来消除分组数据帧中的重复数据。它断言每个组中的值都是相同的,然后只保留组的第一行。我试图给它提供类似于中所示的tidyselect的语义,因为我只需要将列名转发到R 如何将列名称的tidyselect样式列表拼接到my函数的调用中,r,tidyverse,tidyselect,R,Tidyverse,Tidyselect,我正在尝试编写一个函数来消除分组数据帧中的重复数据。它断言每个组中的值都是相同的,然后只保留组的第一行。我试图给它提供类似于中所示的tidyselect的语义,因为我只需要将列名转发到摘要(a=n_distinct(…)调用中 以一个示例表为例 test% 分组人(G) 我希望调用删除\u重复项(test,c(v1,v2))(使用tidyselect助手返回 G F v1 v2 A a 1 2 B a 1 2 但我明白了 Error: `arg` must b
摘要(a=n_distinct(…)
调用中
以一个示例表为例
test%
分组人(G)
我希望调用删除\u重复项(test,c(v1,v2))
(使用tidyselect助手返回
G F v1 v2
A a 1 2
B a 1 2
但我明白了
Error: `arg` must be a symbol
我尝试使用新的语法来解决这个问题(请参阅下面的函数代码),但由于上面显示的消息而失败
#断言每个组中的值是相同的,并保留每个组的第一行
#团体
#选项卡:一个分组的选项卡
#变量:整个组中的列应为常量
删除重复项%
总结(a=n_distinct({{{vars}}})=1、.groups=“drop”)%>%
{stopifnot(全部(.$a))}
#删除重复项
制表符%
切片(1)%>%
解组()
返回(选项卡)
}
我认为我需要以某种方式指定表达式vars
的计算上下文必须更改为tab
的子数据框,该子数据框当前由substitute
进行计算。
大概是
tab %>%
summarise(a = do.call(n_distinct, TIDYSELECT_TO_LIST_OF_VECTORS(vars, context = CURRENT_GROUP))))
但我对技术细节的了解还不够,无法真正实现这一点……如果您首先
enquos
您的vars
然后对结果使用curly-curly运算符,则这一点与预期的效果相同:
删除重复项%
{stopifnot(全部(.$a))}
选项卡%>%slice(1)%%>%ungroup()
}
所以现在
删除重复项(测试,c(v1,v2))
#>#A tibble:2 x 4
#>G F v1 v2
#>
#>1A 12
#>2 B a 3 3
太棒了,谢谢!但是,我不明白为什么会有新的{
操作符。因为如果我写!!vars
而不是{vars}
它也能工作。的好处是什么{{
,那么?@akraf这似乎是n_distinct
的问题,而不是您使用curly-curly操作符的方式。我不知道这是否可能是因为摘要
和n_distinct
都在内部使用enquos
?