在 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 窗口函数中使用多列?的主要内容,如果未能解决你的问题,请参考以下文章
R语言dplyr包arrage函数排序dataframe实战:单列排序多列排序自定义排序
R语言dplyr包使用case_when函数和mutate函数生成新的数据列实战:基于单列生成新的数据列基于多列生成新的数据列