微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用dplyr获得相同的分组结果以获得与sqldf结果一致的结果?

如何解决如何使用dplyr获得相同的分组结果以获得与sqldf结果一致的结果?

我尝试使用 sqldf 和 dplyr 实现 sql 查询
我需要使用这两个不同的库分别执行此操作。
不幸的是,我无法使用 dplyr 产生相同的结果。

library(sqldf)
library(dplyr)

Id       <- c(1,2,3,4)
HasPet   <- c(0,1,1)
Age      <- c(20,14,10)

Posts <- data.frame(Id,HasPet,Age)

# sqldf way
ref <- sqldf("
      SELECT Id,MAX(Age) AS MaxAge
      FROM Posts
      GROUP BY HasPet
  ")

# dplyr way
res <- Posts %>%
  group_by(HasPet) %>%
  summarize(
    Id,MaxAge = max(Age)
    ) %>%
  select(Id,MaxAge)

head(ref)
head(res)

sqldf 的输出是:

> head(ref)
  Id HasPet MaxAge
1  1      0     20
2  3      1     14

虽然 sqldf 的输出不同:

> head(res)
# A tibble: 4 x 3
# Groups:   HasPet [2]
     Id HasPet MaxAge
  <dbl>  <dbl>  <dbl>
1     1      0     20
2     2      0     20
3     3      1     14
4     4      1     14

更新。无法修改 sql 查询

解决方法

代码没有错,但你试图实现的逻辑就是它。让我解释一下:

您的分组的预期输出包含 Id=1,3。但是 R 如何知道是那些而不是 Id=2,4?。更具体地说,当您按 HasPet=0 分组时,R 会选择 Id 的哪个值? 1 还是 2?如果您没有给出具体的使用标准,R 将如何知道它?也就是说,这给出了您的预期输出:

res <- Posts %>%
  group_by(HasPet) %>%
  summarize(Id = min(Id),MaxAge = max(Age))
,

您的问题的答案是 SQL 查询与您的 R 代码版本做同样的事情。这是等效的 SQL 查询:

SELECT Id,HasPet,MAX(Age) OVER (PARTITION BY HasPet) AS MaxAge
FROM Posts

实际上,您当前的查询在技术上是无效的,因为它按 HasPet 聚合,但选择了 Id。不清楚您要选择的Id值。这是原始查询的有效版本:

SELECT HasPet,MAX(Age) AS MaxAge
FROM Posts
GROUP BY HasPet
,

这个问题可以用以下方法解决:

slice(which.min(Id))

在“group_by”和“summarize”函数调用之后。

例如:

# dplyr way
res <- Posts %>%
  group_by(HasPet) %>%
  summarize(
    Id,MaxAge = max(Age)
    ) %>%
  select(Id,MaxAge) %>%
  slice(which.min(Id))

在这种情况下,输出与使用 dplyr 相同:

> res
# A tibble: 2 x 3
# Groups:   HasPet [2]
     Id HasPet MaxAge
  <dbl>  <dbl>  <dbl>
1     1      0     20
2     3      1     14

附言我认为有更简单的方法,但目前我还没有找到。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?