web-dev-qa-db-de.com

Fehler: Datenquelle muss ein Wörterbuch sein (dplyr)

Ich bin sehr neu bei R und habe keine Lösung für mein Problem gefunden. Ich hoffe wirklich, dass du mir helfen kannst.

Obwohl es mehr Spalten und Beobachtungen gibt, sieht mein Datenrahmen wie folgt aus: 

dt <- data.frame(hid = c(1, 2, 2, 2, 2, 4, 4, 4, 4, 4, 4),
                     syear = c(2000, 2001, 2003, 2003, 2003, 2000, 2000, 2001, 2001, 2002, 2002),
                     employlvl = c("Full-time", "Part-time", "Part-time", "Unemployed", "Unemployed",
                                    "Full-time", "Full-time", "Full-time", "Unemployed", "Part-time", 
                                    "Full-time"),
                     relhead = c("Head", "Head", "Head", "Partner", "other", "Head", 
                                                  "Partner", "Head", "Partner", "Head", "Partner")) 

| hid | syear |  employlvl  |       relhead         |
|-----|-------|-------------|-----------------------|
|  1  | 2000  |  Full-time  |         Head          |
|  2  | 2001  |  Part-time  |         Head          |
|  2  | 2003  |  Part-time  |         Head          |
|  2  | 2003  |  Unemployed |        Partner        |
|  2  | 2003  |  Unemployed |         other         |
|  4  | 2000  |  Full-time  |         Head          |
|  4  | 2000  |  Full-time  |        Partner        |
|  4  | 2001  |  Full-time  |         Head          |
|  4  | 2001  |  Unemployed |        Partner        |
|  4  | 2002  |  Part-time  |         Head          |
|  4  | 2002  |  Full-time  |        Partner        |

Ich möchte eine weitere Spalte erstellen, die das Beschäftigungsniveau des Partners angibt, und hoffe, dass folgende Ausgabe erhalten wird:

| hid | syear |  employlvl  |         relhead       |      Partner      |
|-----|-------|-------------|-----------------------|-------------------|
|  1  | 2000  |  Part-time  |         Head          |        NA         |
|  2  | 2001  |  Part-time  |         Head          |        NA         |
|  2  | 2003  |  Part-time  |         Head          |    Unemployed     |
|  2  | 2003  |  Unemployed |       Partner         |        NA         |
|  2  | 2003  |  Unemployed |         other         |        NA         |
|  4  | 2000  |  Full-time  |         Head          |     Full-time     |
|  4  | 2000  |  Full-time  |        Partner        |        NA         |
|  4  | 2001  |  Full-time  |         Head          |    Unemployed     |
|  4  | 2001  |  Unemployed |        Partner        |        NA         |
|  4  | 2002  |  Part-time  |         Head          |     Full-time     |
|  4  | 2002  |  Full-time  |        Partner        |        NA         |

Derzeit verwende ich den folgenden Code. (Nochmals vielen Dank Benutzer ycw)

library(dplyr)
library(tidyr)

dt2 <- dt %>%
  group_by(hid, syear) %>%
  filter(n() > 1) %>%
  filter(`relhead` != "Child") %>%
  spread(relhead, employlvl) %>%
  mutate(Relation = "Head") %>%
  rename(`Employment Partner` = Partner) %>%
  select(-Head)

dt3 <- dt %>%
  left_join(dt2, by = c("hid", "syear", "relhead" = "Relation"))

Der Code funktioniert für diesen kleinen Datensatz absolut einwandfrei. Sobald ich jedoch meine gesamten Daten ausprobiere, erhalte ich Folgendes:

Error: Data source must be a dictionary

Vielen Dank für deine Hilfe.

15
Manuel

Wie in anderen Antworten angegeben, wird dies durch nicht eindeutige Namen verursacht. Ich konnte Fehler durch Ändern Ihres Beispiels reproduzieren (drittes Element von relhead)

dt <- data.frame(
  hid = c(1, 2, 2, 2, 2, 4, 4, 4, 4, 4, 4),
  syear = c(2000, 2001, 2003, 2003, 2003, 2000, 2000, 2001, 2001, 2002, 2002),
  employlvl = c("Full-time", "Part-time", "Part-time", "Unemployed", "Unemployed",
     "Full-time", "Full-time", "Full-time", "Unemployed", "Part-time", 
     "Full-time"),
  relhead = c("Head", "Head", "Employment Partner", "Partner", "other", "Head", 
     "Partner", "Head", "Partner", "Head", "Partner")
) 

In diesem Fall erstellt spread die erste "Employment Partner"-Spalte und rename die zweite. Sie sollten prüfen, ob sich "Employment Partner", "Relation" (und möglicherweise hid, syear) in dt$relhead befindet (der erste gibt einen Fehler aus, der zweite wird durch mutate(Relation=...) überschrieben).

Minimal reproduzierbares Beispiel:

data_frame(g = c("a1","a2","a3"), i=1) %>%
    spread(g, i) %>%
    rename(a1 = a3) %>%
    select(-a1)
5
Marek

Ich habe gerade das gleiche Problem mit der gleichen Fehlermeldung gefunden. Nachdem ich meinen Datensatz sorgfältig geprüft hatte, stellte ich fest, dass es zwei Spalten mit demselben Namen gibt. Nachdem ich einen von ihnen umbenannt habe, funktioniert es ohne Fehler. 

13
Grace

Ich habe die gleiche Fehlermeldung erhalten, als 2 Spalten denselben Namen hatten und einen Spaltennamen mit geändert haben 

namen () <- c (...)

hat den Trick für mich gemacht.

8
Julien Colomb

Ich habe dieselbe Fehlermeldung erhalten, als ich in rename()-Anweisung von dplyr-Paket unaufmerksam die gleichen neuen Namen verwendet habe. Vergleichen Sie names(df2) mit unique(names(df2)), da Sie möglicherweise bereits denselben Variablennamen verwendet haben.

3
AnnaZ

Es wird durch das Ausführen der select(-variable) nach dem rename-Aufruf verursacht. Ich habe den gleichen Fehler erhalten und als ich den Aufruf "Umbenennen" entfernte und dieselbe Auswahl (-variable) ausführte, funktionierte es.

Habe keine Ahnung, warum dies der Fall ist, aber das ist der Auslöser für den Fehler.

1
Brent B

Wenn der Fehler erst auftritt, nachdem Sie select(-Head) ausgeführt haben, können Sie möglicherweise eine Problemumgehung finden, indem Sie den Basisbefehl R verwenden, um dasselbe zu erreichen.

library(dplyr)
library(tidyr)

dt2 <- dt %>%
  group_by(hid, syear) %>%
  filter(n() > 1) %>%
  filter(`relhead` != "Child") %>%
  spread(relhead, employlvl) %>%
  mutate(Relation = "Head") %>%
  rename(`Employment Partner` = Partner)

Der obige Teil stimmt mit dem Originalcode überein. Führen Sie danach folgendes aus.

dt2$Head <- NULL

Dies ist ein Basis-R-Befehl zum Entfernen der Head-Spalte. Dies ist das gleiche, was select(-Head) tun möchte.

Und dann können Sie den Rest des Codes ausführen, um die Datenrahmen zu verbinden.

dt3 <- dt %>%
  left_join(dt2, by = c("hid", "syear", "relhead" = "Relation"))

Da Sie kein reproduzierbares Beispiel geliefert haben, konnten wir nicht herausfinden, was diese Fehlermeldung wirklich bedeutet. Vielleicht hilft Ihnen diese Problemumgehung, Ihre Aufgabe zu lösen. 

1
www

Ich weiß, dass dies jetzt ein bisschen alt ist, aber für alle Interessierten ist das Problem (glaube ich) der Unterschied im Verhalten zwischen gleichnamigen Funktionen in plyr und dplyr. Wenn Sie beide geladen haben, können Sie unerwartete Ergebnisse erhalten. Ich sehe das mit group_by und fasse es auch zusammen.

Im Allgemeinen ist der beste Weg, den ich gefunden habe, um damit umzugehen, einfach dplyr :: select, dplyr :: umbenennen und so weiter.

Was noch besser wäre, wäre einfach, plyr nicht zu verwenden, weil dplyr es an dieser Stelle abgedeckt hat, aber ich habe einen älteren Code, der plyr verwendet, also bin ich zurückhaltend, um mit ihm rumzufummeln.

0
jsg51483