计算使用dplyr访问sql表的行数的有效方法是什么。 MWE低于使用SQLite,但我使用PostgreSQL并遇到同样的问题。基本上昏暗()不是很一致。我用了
dim()
这适用于数据库中的模式(第一种情况),但是当我从同一模式的SQL查询创建tbl时(第二种情况),它不是很一致。我的行数是数百万,或者即使只有1000行也能看到。我得到NA或??有什么遗失的吗?
#MWE
test_db <- src_sqlite("test_db.sqlite3", create = T)
library(nycflights13)
flights_sqlite <- copy_to(test_db, flights, temporary = FALSE, indexes = list(
c("year", "month", "day"), "carrier", "tailnum"))
flights_postgres <- tbl(test_db, "flights")
第一种情况(来自直接模式的表)
flights_postgres
> flights_postgres
Source: postgres 9.3.5 []
From: flights [336,776 x 16]
year month day dep_time dep_delay arr_time arr_delay carrier tailnum flight origin dest air_time distance hour minute
1 2013 1 1 517 2 830 11 UA N14228 1545 EWR IAH 227 1400 5 17
2 2013 1 1 533 4 850 20 UA N24211 1714 LGA IAH 227 1416 5 33
#using dim()
> dim(flights_postgres)
[1] 336776 16
以上工作并获得行数的计数。 第二种情况(SQL查询表)
## use the flights schema above but can also be used to create other variables (like lag, lead) in run time
flight_postgres_2 <- tbl(test_db, sql("SELECT * FROM flights"))
>flight_postgres_2
Source: postgres 9.3.5 []
From: <derived table> [?? x 16]
year month day dep_time dep_delay arr_time arr_delay carrier tailnum flight origin dest air_time distance hour minute
1 2013 1 1 517 2 830 11 UA N14228 1545 EWR IAH 227 1400 5 17
2 2013 1 1 533 4 850 20 UA N24211 1714 LGA IAH 227 1416 5 33
>
> dim(flight_postgres_2)
[1] NA 16
如你所见它打印为??或者NA。所以不是很有帮助。
我通过使用collect()或者使用as.data.frame()将输出转换为数据框来检查维度。但考虑到大量行可能需要的时间,这两种方法可能不是理想的解决方案。
答案 0 :(得分:2)
我认为答案是@alistaire建议的:在数据库中做。
> flight_postgres_2 %>% summarize(n())
Source: sqlite 3.8.6 [test_db.sqlite3]
From: <derived table> [?? x 1]
n()
(int)
1 336776
.. ...
要求dim
执行此操作将是您的蛋糕(使用dplyr
对SQL进行惰性评估,将数据保留在数据库中)并将其吃掉(完全访问{{1}中的数据}})。
请注意,这是在@ alistaire的方法下面进行的:
R