web-dev-qa-db-fra.com

Erreur: la source de données doit être un dictionnaire (dplyr)

Je suis très nouveau chez R et je n'ai pas trouvé de solution à mon problème. J'espère vraiment que tu peux m'aider.

Bien qu'il y ait plus de colonnes et d'observations, mon cadre de données se présente comme suit: 

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        |

J'aimerais créer une autre colonne indiquant le niveau d'emploi du partenaire et espère obtenir le résultat suivant:

| 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         |

Actuellement, j'utilise le code suivant. (Merci encore utilisateur 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"))

Le code fonctionne parfaitement pour ce petit ensemble de données. Mais dès que j'essaie d'avoir toutes mes données, j'obtiens ce qui suit:

Error: Data source must be a dictionary

Je vous remercie beaucoup pour votre aide.

15
Manuel

Comme indiqué dans d'autres réponses, cela est dû à des noms non uniques. J'ai pu reproduire une erreur en modifiant votre exemple (troisième élément de 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")
) 

Dans ce cas, spread crée la première colonne "Employment Partner" et rename crée la seconde. Vous devriez vérifier si l'un des "Employment Partner", "Relation" (et peut-être hid, syear) est en dt$relhead (le premier vous donne une erreur, le second écrase par mutate(Relation=...)).

Exemple reproductible minimal:

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

Je viens de rencontrer le même problème avec le même message d'erreur. Après avoir soigneusement vérifié mon ensemble de données, j'ai constaté qu'il y a deux colonnes portant le même nom. Après avoir renommé l’un d’eux, cela fonctionne sans erreur. 

13
Grace

J'ai eu la même erreur quand 2 colonnes avaient le même nom, en modifiant un nom de colonne en utilisant 

noms () <- c (...)

a fait le tour pour moi.

8
Julien Colomb

J'ai reçu le même message d'erreur lorsque j'ai utilisé de manière inattendue 2 les mêmes nouveaux noms dans l'instruction rename() du package dplyr. Comparez names(df2) avec unique(names(df2)) car vous avez peut-être déjà eu le même nom de variable auparavant.

3
AnnaZ

Cela est causé par l'exécution de select(-variable) après l'appel rename. J'ai eu la même erreur et quand j'ai supprimé l'appel "renommer" et fait la même sélection (-variable) cela a fonctionné.

Je ne sais pas pourquoi c'est le cas, mais c'est le déclencheur de l'erreur.

1
Brent B

Si l'erreur ne se produit qu'après l'exécution de select(-Head), vous pouvez probablement trouver une solution de contournement en utilisant la commande base R pour obtenir le même résultat.

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)

La partie ci-dessus est la même que le code d'origine. Après cela, exécutez ce qui suit.

dt2$Head <- NULL

Il s'agit d'une commande de base R permettant de supprimer la colonne Head, qui correspond à la même chose que select(-Head) souhaite effectuer.

Et ensuite, vous pouvez exécuter le reste du code pour joindre les trames de données.

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

Étant donné que vous n’avez pas fourni d’exemple reproductible, nous n’avons pas pu comprendre la signification réelle de ce message d’erreur, mais cette solution de contournement peut vous aider à atteindre votre tâche pour le moment. 

1
www

Je sais que cela est un peu vieux maintenant, mais pour tous les intéressés, le problème (je crois) est la différence de comportement entre les fonctions portant le même nom dans plyr et dplyr. Ainsi, lorsque vous les avez tous les deux chargés, vous pouvez obtenir des résultats inattendus. Je vois cela avec group_by et résume aussi.

Généralement, la meilleure façon que j'ai trouvée de gérer cela consiste à utiliser simplement dplyr :: select, dplyr :: rename, etc.

Ce qui serait encore mieux, ce serait simplement de ne pas utiliser plyr, car dplyr le couvre maintenant, mais j'ai un code hérité qui utilise plyr, donc je suis réticent à en parler.

0
jsg51483