2016-05-04 1 views
0

Ich habe ein kleines Problem mit der Funktion inner_join() von dplyr. Ich habe zwei Tabellen LatLong und data_stops.Fehler beim Zusammenführen der Tabelle mit dplyr

LatLong ist:

> str(LatLong) Classes ‘data.table’ and 'data.frame': 43456 obs. of 3 variables: $ Idindx : num 1 3 5 7 9 11 13 15 17 19 ... $ latMean : 
num 54.8 54.8 54.8 54.8 54.8 ... $ longMean: num 11.1 11.1 11.1 
11.1 11.1 ... 
    - attr(*, ".internal.selfref")=<externalptr> 
    - attr(*, "vars")=List of 1 ..$ : symbol Idindx 

> dput(head(LatLong)) 
structure(list(Idindx = c(1, 3, 5, 7, 9, 11), latMean = c(54.831033947613, 
54.8310100000107, 54.8309920000003, 54.8310145000011, 54.8310115000001, 
54.831043), longMean = c(11.1227872540957, 11.1227459999747, 
11.1227690000004, 11.1227944999961, 11.1228075000002, 11.1228525 
)), .Names = c("Idindx", "latMean", "longMean"), class = "data.frame", row.names = c(NA, 
-6L)) 

und data_stops ist:

'data.frame': 2020 obs. of 7 variables: 
$ Idindx   : num 1 3 5 7 9 11 13 15 17 19 ... 
$ minTime   : POSIXct, format: "2008-06-01 00:07:16" "2008-06-01 08:44:42" "2008-06-01 08:50:18" "2008-06-01 08:56:45" ... 
$ maxTime   : POSIXct, format: "2008-06-01 08:40:25" "2008-06-01 08:46:33" "2008-06-01 08:52:43" "2008-06-01 08:58:44" ... 
$ duration_minutes:Class 'difftime' atomic [1:2020] 513 2 2 2 1 1 3 3 6 7 ... 
    .. ..- attr(*, "units")= chr "mins" 
$ Ship   : num NA NA NA NA NA ... 
$ latMean   : num 54.8 54.8 54.8 54.8 54.8 ... 
$ longMean  : num 11.1 11.1 11.1 11.1 11.1 ... 



> dput(head(data_stops)) 
structure(list(Idindx = c(1, 3, 5, 7, 9, 11), minTime = structure(c(1212268036, 
1212299082, 1212299418, 1212299805, 1212300243, 1212300629), class = c("POSIXct", 
"POSIXt")), maxTime = structure(c(1212298825, 1212299193, 1212299563, 
1212299924, 1212300293, 1212300664), class = c("POSIXct", "POSIXt" 
)), duration_minutes = structure(c(513, 2, 2, 2, 1, 1), units = "mins", class = "difftime"), 
    Ship = c(111111111, 111111111, 111111111, 111111111, 111111111, 
    111111111)), .Names = c("Idindx", "minTime", "maxTime", "duration_minutes", 
"Ship"), class = "data.frame", row.names = c(NA, -6L)) 

Als ich versuchte, sie Idindx folgende zu fusionieren Ich habe folgende Fehlermeldung:

final_data<- inner_join(data_stops, LatLong) 

Joining by: "Idindx" 
Error in data.table::setkeyv(x, by$x) : 
    4 arguments passed to .Internal(nchar) which requires 3 

Hier ist, was ich versuchte, :

  • Update RStudio und die Pakete die ich benutze: kein Erfolg
  • auch Druck zu verwenden (LatLong, data_stops, durch = „Idindx“): ohne Erfolg
  • sicher zu stellen, dass die beiden Tabellen das gleiche Format haben: wie .data.table(): kein Erfolg
  • um sicherzustellen, dass Idindx für beide der Tabelle numerisch ist: ohne Erfolg

mit

Schließlich
final_data <- full_join(data_stops, LatLong, by="Idindx") 

Es hat funktioniert!

Ich würde gerne verstehen, warum inner_join() hier nicht funktioniert!

Vielen Dank!

+0

Vielleicht weil 'str (LatLong) Klassen 'data.table' und 'dat.frame''? Join Funktionen nehmen als Argumente tbls –

+0

Vielen Dank. Ich verstehe das nicht. Mit 'as.data.table()' haben beide das gleiche 'str()'! – Floni

+1

@Floni Können Sie Ihre Frage mit dem Ergebnis von 'dput (head (LatLong))' und 'dput (head (data_stops))' bearbeiten. Ich kann es dann versuchen. – Phil

Antwort

0

die Daten verwenden Sie auf dem Laufenden (dput()) Ich hatte kein Problem, die Daten mit dplyr::inner_join() Beitritt:

data_stops <- structure(list(Idindx = c(1, 3, 5, 7, 9, 11), minTime = structure(c(1212268036, 
                        1212299082, 1212299418, 1212299805, 1212300243, 1212300629), class = c("POSIXct", 
                                         "POSIXt")), maxTime = structure(c(1212298825, 1212299193, 1212299563, 
                                                  1212299924, 1212300293, 1212300664), class = c("POSIXct", "POSIXt" 
                                                  )), duration_minutes = structure(c(513, 2, 2, 2, 1, 1), units = "mins", class = "difftime"), 
          Ship = c(111111111, 111111111, 111111111, 111111111, 111111111, 
             111111111)), .Names = c("Idindx", "minTime", "maxTime", "duration_minutes", 
                   "Ship"), class = "data.frame", row.names = c(NA, -6L)) 

LatLong <- structure(list(Idindx = c(1, 3, 5, 7, 9, 11), latMean = c(54.831033947613, 
                    54.8310100000107, 54.8309920000003, 54.8310145000011, 54.8310115000001, 
                    54.831043), longMean = c(11.1227872540957, 11.1227459999747, 
                           11.1227690000004, 11.1227944999961, 11.1228075000002, 11.1228525 
                    )), .Names = c("Idindx", "latMean", "longMean"), class = "data.frame", row.names = c(NA, 
                                          -6L)) 

require("dplyr") 
final_data <- inner_join(data_stops, LatLong, by = "Idindx") 
head(final_data) 

# Idindx    minTime    maxTime duration_minutes  Ship 
# 1  1 2008-05-31 22:07:16 2008-06-01 06:40:25   513 mins 111111111 
# 2  3 2008-06-01 06:44:42 2008-06-01 06:46:33   2 mins 111111111 
# 3  5 2008-06-01 06:50:18 2008-06-01 06:52:43   2 mins 111111111 
# 4  7 2008-06-01 06:56:45 2008-06-01 06:58:44   2 mins 111111111 
# 5  9 2008-06-01 07:04:03 2008-06-01 07:04:53   1 mins 111111111 
# 6  11 2008-06-01 07:10:29 2008-06-01 07:11:04   1 mins 111111111 
# (Truncated) 

ich ohne inner_join() habe keine Probleme haben, einen Schlüssel entweder angeben. Ich vermute, dass etwas in Ihrer Umgebung geändert wurde und wenn saubere Daten verwendet wurden, funktionierte es wie beabsichtigt.

Nebenbei würde ich vermeiden, verschiedene Notationen für die Benennung von Objekten in R (oder einer anderen Programmiersprache) zu verwenden: Sie mischen camel case (LatLong) mit einem Unterstrich (data_stops). Ich würde das eine oder das andere benutzen. Ich bevorzuge Unterstreichung, weil ich es einfacher finde, zu scannen, aber es spielt keine Rolle.