r语言 - 错误:数据源必须是字典 (dplyr)



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

非常感谢您的帮助。

刚刚遇到了带有相同错误消息的类似问题。仔细检查我的数据集后,我发现有两列具有相同的名称。在我重命名其中一个后,它就可以正常工作。

如其他答案所述,这是由非唯一名称引起的。我能够通过修改您的示例来重现错误(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"(也许hidsyear(中的任何一个都在dt$relhead中(第一个给你错误,第二个被mutate(Relation=...)覆盖(。

最小可重现示例:

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

当我不专心地在包rename()语句中使用 2 个相同的新名称时dplyr我收到了相同的错误消息。将names(df2)unique(names(df2))进行比较,因为您之前可能已经具有相同的变量名称。

如果错误仅在运行select(-Head)后发生,则可以通过使用 base 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

这是删除Head列的基本 R 命令,这与select(-Head)想要执行的操作相同。

然后,您可以运行其余代码来联接数据框。

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

由于您没有提供可重现的示例,因此我们无法弄清楚此错误消息的真正含义,但也许此解决方法可以帮助您暂时完成任务。

这是由于在rename调用后执行select(-variable)引起的。 我遇到了同样的错误,当我删除"重命名"调用并执行相同的选择(-变量(时,它起作用了。

不知道为什么会这样,但这是错误的触发因素。

我知道这现在有点老了,但对于所有感兴趣的人来说,问题(我相信(是 plyr 和 dplyr 中同名函数之间的行为差异。因此,当您同时加载它们时,您可能会得到意想不到的结果。我也从group_by和总结中看到了这一点。

一般来说,我发现处理这个问题的最好方法是只使用 dplyr::select、dplyr::rename 等。

更好的办法是不使用 plyr,因为 dplyr 在这一点上已经涵盖了它,但我有一些使用 plyr 的遗留代码,所以我不愿意使用它。

最新更新