dplyr不同列值sql

dplyr不同列值sql,sql,r,dplyr,Sql,R,Dplyr,我将dplyr与PostgreSQL数据库结合使用,这使得我很难复制一个示例。无论如何,我想使用distinct函数过滤掉混乱的数据,即重复的时间戳。到目前为止,我已经: db <- src_postgres(dbname = "a", host = "b", port = 1234, user = "c") measurements <- tbl(adres_db, "measurement") sites <- group_by(m

我将dplyr与PostgreSQL数据库结合使用,这使得我很难复制一个示例。无论如何,我想使用distinct函数过滤掉混乱的数据,即重复的时间戳。到目前为止,我已经:

db <- src_postgres(dbname = "a", host = "b", port = 1234,
                   user = "c")

measurements <- tbl(adres_db, "measurement")

sites <- group_by(measurements, site)

sites_clean <- filter(sites,
                      site < 38)

sites_clean <- distinct(sites_clean, timestamp)

P_stats <- summarise(
  sites_clean,
  count = n(),
  P = mean(p_sum)
)

collect(P_stats)

虽然这样做有效,但我觉得它并不像它可能的那么干净。此外,我还需要在PostgreSQL实例上尝试使用row_numbertimestamp==1的建议。

按时间戳分组,然后选择每个组的第一行?感谢您的提示,在阅读详细文档后,我尝试了几次,我发现我应该使用filtersites_clean,row_number==1而不是slice,但是我得到了一个RS-DBI驱动程序:无法检索结果:错误:column measurement.site必须出现在GROUP BY子句中,或者在聚合函数行3中使用:FROM SELECT site,timestamp,count*AS count,AVG…您需要行号,因为DB没有顺序的概念,只是一个旁注:您可以使用dplyr的%>%运算符,这样您就不需要创建许多不同的数据版本/子集。
library(dplyr)

set.seed(1)

my_db <- src_sqlite("my_db.sqlite3", create = T)

meas <- data.frame(id = 1:30,
                   timestamp = sample(Sys.time() + c(1,2,3) * 3600,
                     size = 30, replace = TRUE),
                   site = sample(c(1, 2, 40), size = 30, replace = TRUE),
                   p_sum = rpois(30, 2))

meas_sqlite <- copy_to(my_db, meas, temporary = FALSE)

meas_tbl <- tbl(my_db, "meas")

P_stats <- group_by(meas_tbl, site, timestamp) %>%
  summarise(P = mean(p_sum)) %>%
  group_by(site) %>%
  filter(site < 38) %>%
  summarise(count = n(), P = mean(P))

collect(P_stats)