zählen Was wäre der effiziente Weg, um die Anzahl der Zeilen zu zählen, die mit dplyr auf SQL-Tabelle zuzugreifen. MWE benutzt SQLite, aber ich benutze PostgreSQL und habe das gleiche Problem. Grundsätzlich ist dim() nicht sehr konsistent. Ich benutzenAnzahl der Zeilen bei Verwendung von dplyr für den Zugriff auf SQL-Tabelle/Abfrage
dim()
Dies funktioniert für ein Schema in der Datenbank (erster Fall), ist aber nicht sehr konsequent, wenn ich eine Tabl aus einer SQL-Abfrage für das gleiche Schema (zweiter Fall) erstellen. Meine Anzahl an Zeilen ist in Millionen oder ich sehe das sogar mit einer kleinen 1000 von Zeilen. Ich bekomme NA oder ??. Gibt es etwas, das fehlt?
#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")
Erster Fall (Tabelle aus direkten Schema)
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
Die oben genannten Arbeiten und die Zählung der Anzahl der Zeilen erhalten. Zweiter Fall (Tabelle aus SQL-Abfrage)
## 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
Wie Sie es entweder druckt wie sehen ?? oder NA. Also nicht sehr hilfreich.
Ich habe dies umgehen, indem Sie entweder mit collect() oder dann konvertieren Sie die Ausgabe in einen Datenrahmen mit as.data.frame(), um die Dimension zu überprüfen. Aber diese zwei Methoden sind möglicherweise nicht die ideale Lösung angesichts der Zeit, die für eine größere Anzahl von Reihen benötigt wird.
Ich kann nicht Ihre MWE zu arbeiten, es zu testen, aber ich würde versuchen, 'tally' oder' n' wenn Sie innerhalb einer anderen Funktion. – alistaire
@alistaire machte Änderungen an der MWE - verwendet diesmal SQLite, aber das Problem ist das gleiche. – rajvijay
'tally' funktioniert gut für mich, wie' summieren (n()) ' – alistaire