在 dplyr 窗口函数中使用多列?

Posted

技术标签:

【中文标题】在 dplyr 窗口函数中使用多列?【英文标题】:Using multiple columns in dplyr window functions? 【发布时间】:2018-01-19 08:54:09 【问题描述】:

从 SQL 开始,我希望我能够在 dplyr 中执行以下操作,这可能吗?

# R
tbl %>% mutate(n = dense_rank(Name, Email))

-- SQL
SELECT Name, Email, DENSE_RANK() OVER (ORDER BY Name, Email) AS n FROM tbl

PARTITION BY 也有等价物吗?

【问题讨论】:

喜欢这个mtcars %>% mutate(n = dense_rank(interaction(cyl, hp)))? @docendodiscimus 太棒了,完全忘记了interaction() 我已经对这些值进行了哈希处理,但这会打乱顺序。使用PARTITION BY有什么简单的解决方案吗? 我不知道那是什么 @CodeMonkey - 如果您想通过PARTITION BY 获得分组排名,您可以在 dplyr 中使用group by。 ***.com/questions/34967837/… @Jason 太棒了!它的工作。使用与lex.order 的交互几乎可以模拟 OVER(ORDER BY) 和 group_by 就像一个魅力。谢谢! 【参考方案1】:

我确实遇到了这个问题,这是我的解决方案:

如果您找不到任何支持按多个变量排序的函数,我建议您使用paste() 按优先级从左到右连接它们。

下面是代码示例:

tbl %>%
  mutate(n = dense_rank(paste(Name, Email))) %>%
  arrange(Name, Email) %>%
  view()

此外,我猜 group_by 相当于 SQL 中的 PARTITION BY。

此解决方案的不足之处在于您只能按 2 个(或更多)具有相同方向的变量排序。如果您需要按具有不同方向的多个列进行排序,例如 1 asc 和 1 desc,我建议您尝试以下操作: Calculate rank with ties based on more than one variable

【讨论】:

您提出的示例与所要求的示例不同。尝试更新它以匹配问题创建者提供的示例。 您好,如果您解决了答案,我可以将其设置为已接受。

以上是关于在 dplyr 窗口函数中使用多列?的主要内容,如果未能解决你的问题,请参考以下文章

使用 dplyr 对多列进行不同操作的汇总

R语言dplyr包arrage函数排序dataframe实战:单列排序多列排序自定义排序

R语言dplyr包使用case_when函数和mutate函数生成新的数据列实战:基于单列生成新的数据列基于多列生成新的数据列

使用 dplyr 和 RcppRoll 计算所有固定窗口平均值

Spark中多列的窗口聚合

如何在sql中使用pivot到多列