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

4

作为来自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相当的东西?


1
像这样 mtcars %>% mutate(n = dense_rank(interaction(cyl, hp))) - talat
@docendodiscimus 太棒了,我完全忘记了interaction(),我已经对值进行了哈希处理,但这会破坏顺序。有没有使用PARTITION BY的简单解决方案? - CodeMonkey
我不知道那是做什么的。 - talat
如果你想使用PARTITION BY按组进行排名,你可以在dplyr中使用group by - Jason
@Jason 太棒了!它正在工作。使用与 lex.order 的交互,几乎可以模拟 OVER(ORDER BY),而 group_by 的工作也非常出色。谢谢! - CodeMonkey
1个回答

0

我曾经为这个问题苦恼过,以下是我的解决方案:

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

下面是代码示例:

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

此外,我猜 group_by 是 SQL 中 PARTITION BY 的等价物。
这种解决方案的缺点是,您只能按具有相同方向的 2(或更多)变量排序。如果您需要按具有不同方向的多个列进行排序,例如1升序和1降序,则建议您尝试此方法: 基于多个变量计算带有绑定的排名

你提出的例子与所要求的不同。请尝试更新它以匹配问题创建者提供的示例。 - guzmonne
嗨宝,如果你修正了你的答案,我可以将其设置为被采纳。 - CodeMonkey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接