R:相当于“等级”和“分区”[关闭]
Posted
技术标签:
【中文标题】R:相当于“等级”和“分区”[关闭]【英文标题】:R: Equivalent of "rank" and "partition" [closed] 【发布时间】:2022-01-19 02:54:08 【问题描述】:我正在使用 R 编程语言。我有以下 SQL 查询:
select b.var1 as var1, b.var2 from
(select *, rank() over( partition by var1 order by var3) as rank1
from my_table)b;
这段 SQL 代码的目标是:
查找包含相同“var1”重复值的记录组 对于每个组,根据它们的“var3”值对这些记录进行排序 对于每组排序的重复记录,只保留“var3”值最大的记录 注意:包含“var1”非重复值的记录保持不变我的问题:有谁知道是否可以在 R 中运行相同的代码?例如:
library(RODBC)
library(dbi)
library(odbc)
library(sqldf)
library(SQLite)
dbWriteTable(my_db_connection, SQL(" select b.var1 as var1, b.var2 from
(select *, rank() over( partition by var1 order by var3) as rank1
from my_table)b " ), results_of_this_query)
有谁知道是否可以在 R 中做到这一点? R 能识别“rank()”、“over”和“partition”等 SQL 命令吗?
谢谢!
【问题讨论】:
如果 my_table 是 R 中的数据框,则library(sqldf); sqldf("...")
将处理它,其中“...”是包含涉及 my_table 的 SQL 语句的字符串。默认情况下,它使用 SQLite 作为后端,但也支持其他 3 个后端。请注意r 标记页面顶部关于提问的信息,特别是问题应包括输入,此处为 my_table,并且应使用 dput 显示,以便其他人可以运行该语句。
【参考方案1】:
Tidyverse collection of packages 尤其是dplyr 可以轻松地为您在语法上像 SQL 上完成这项任务。
最终的代码应该是这样的
df %>%
group_by(var1) %>%
mutate(rank = dense_rank(var3))
我可能看不懂你的 SQL 字符串并做出了正确的翻译,因为 SQL 语言不是我的强项。
【讨论】:
@Gregory Oliveira:谢谢你的回答!是否可以将您的答案与 dbWriteTable() 命令一起使用?例如: dbWriteTable(my_db_connection, SQL(" df %>% group_by(var1) %>% mutate(rank = dense_rank(var3)) " ), results_of_this_query) ?谢谢! @stats555,我稍后再试。我需要用 SQL 回顾一些导入任务,然后我会为您提供代码。待会见!【参考方案2】:在按分区和排序列排序后,考虑ave
和rank
:
df <- with(df, df[order(var1, var3),])
df$rank1 <- with(df, ave(var3, var1, FUN=rank))
为其他参数添加 lambda:
df$rank1 <- with(df, ave(var3, var1, FUN=function(x) rank(x, ties.method="first", na.last="keep")))
【讨论】:
@Parfait:谢谢你的回答!是否可以将您的答案与“dbWriteTable”命令一起使用?例如:dbWriteTable(my_db_connection, SQL(" with(df, ave(1:nrow(df), var2, FUN=function(x) rank(x, ties.method="first", na.last="keep" ))) "), results_of_this_query) ?谢谢! 嗯...为什么不直接运行SQL?以上是关于R:相当于“等级”和“分区”[关闭]的主要内容,如果未能解决你的问题,请参考以下文章