【问题标题】:Using multiple columns in dplyr window functions?在 dplyr 窗口函数中使用多列?
【发布时间】: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 bystackoverflow.com/questions/34967837/…
  • @Jason 太棒了!它的工作。使用与lex.order 的交互几乎可以模拟 OVER(ORDER BY) 和 group_by 就像一个魅力。谢谢!

标签: r dplyr window-functions


【解决方案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

【讨论】:

  • 您提出的示例与所要求的示例不同。尝试更新它以匹配问题创建者提供的示例。
  • 您好,如果您解决了答案,我可以将其设置为已接受。
猜你喜欢
  • 2015-02-16
  • 2017-09-18
  • 2017-01-05
  • 1970-01-01
  • 1970-01-01
  • 2018-01-16
  • 1970-01-01
相关资源
最近更新 更多