Ошибка: источником данных должен быть словарь (dplyr)

Im очень новый для R и не нашел решения для моей проблемы. Я очень надеюсь, что ты сможешь мне помочь.

Хотя есть больше столбцов и наблюдений, мой блок данных выглядит следующим образом:

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        |

Я хотел бы создать еще один столбец, который указывает на уровень занятости Партнера и надеется получить следующий результат:

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

В настоящее время я использую следующий код. (Еще раз спасибо пользователю 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"))

Код работает абсолютно нормально для этого небольшого набора данных. Но как только я пробую за все свои данные, я получаю следующее:

Error: Data source must be a dictionary

Спасибо большое за вашу помощь.

Ответы

Ответ 1

Как указано в других ответах, это вызвано не уникальными именами. Я смог воспроизвести ошибку, изменив ваш пример (третий элемент 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")
) 

В этом случае spread создает первую колонку "Employment Partner" а rename создает вторую. Вы должны проверить, если какой - либо из "Employment Partner", "Relation" (и, возможно, hid, syear) в dt$relhead (первый один дает ошибку, второй один перезаписать на mutate(Relation=...)).

Минимальный воспроизводимый пример:

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

Ответ 2

Просто наткнулся на аналогичную проблему с тем же сообщением об ошибке. После тщательного проверки моего набора данных я обнаружил, что есть два столбца с одинаковым именем. После того, как я переименовал один из них, он работает без ошибок.

Ответ 3

Я получил ту же ошибку, когда 2 столбца имели одинаковое имя, изменяя одно имя столбца, используя

names() <- c (...)

помогло.

Ответ 4

Я получил то же сообщение об ошибке, когда я невнимательно использовал 2 одинаковых новых имени в dplyr rename() пакета dplyr. Сравните names(df2) с unique(names(df2)) как раньше у вас уже было такое же имя переменной.

Ответ 5

Если ошибка возникает только после select(-Head), вы можете найти обходное решение, используя базовую команду R для достижения того же.

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)

Вышеупомянутая часть совпадает с исходным кодом. После этого запустите следующее.

dt2$Head <- NULL

Это базовая команда R, чтобы удалить столбец Head, который хочет select(-Head) тот же select(-Head).

И затем вы можете запустить остальную часть кода, чтобы присоединиться к кадрам данных.

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

Поскольку вы не представили воспроизводимый пример, мы не могли понять, что это сообщение действительно означает, но, возможно, это решение может помочь вам в достижении вашей задачи.

Ответ 6

Это вызвано выполнением select(-variable) после вызова rename. Я получил ту же ошибку, и когда я удалил вызов "переименовать" и сделал тот же выбор (-variable), он сработал.

Не поймите, почему это так, но это триггер ошибки.

Ответ 7

Я знаю, что это немного устарело сейчас, но для всех заинтересованных, проблема (я считаю) - это разница в поведении между одинаково названными функциями в plyr и dplyr. Поэтому, когда вы загружаете их, вы можете получить неожиданные результаты. Я вижу это с group_by и суммирую.

Как правило, лучший способ, который я нашел для этого, - просто использовать dplyr :: select, dplyr :: rename и т.д.

Что было бы лучше, просто было бы не использовать plyr, потому что dplyr его охватывает в этот момент, но у меня есть код устаревшего кода, который использует plyr, поэтому я сдержанно трахаюсь с ним.