Ошибка: источником данных должен быть словарь (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, поэтому я сдержанно трахаюсь с ним.