错误:数据源必须是字典 (dplyr)

Posted

技术标签:

【中文标题】错误:数据源必须是字典 (dplyr)【英文标题】:Error: Data source must be a dictionary (dplyr) 【发布时间】:2018-01-27 22:15:42 【问题描述】:

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

非常感谢您的帮助。

【问题讨论】:

如果你逐行运行代码,你能确定是哪一行触发了错误吗?由于该错误在小型数据集中不可复制,因此我们需要更多有关其发生位置的信息。 小示例数据集和实际数据集之间一定存在差异。请仔细检查这两个数据集,看看是否有任何差异。您还可以使用 dput 函数共享全部或部分实际数据集,并在此处发布以供其他人查看。 不幸的是,我正在处理敏感数据,并且不允许共享它们。但我认为问题在于我的列比上面的数据框多。如果我在示例数据框中添加另一列,我不会得到所需的输出。错误发生在代码的最后一行 (select(-Head))。 【参考方案1】:

如果错误仅在您运行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

这是删除 Head 列的基本 R 命令,这与 select(-Head) 想要做的事情相同。

然后您可以运行其余代码来加入数据框。

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

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

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

通常,我发现处理此问题的最佳方法是仅使用 dplyr::select、dplyr::rename 等。

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

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

如其他答案所述,这是由非唯一名称引起的。我能够通过修改您的示例来重现错误(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)

【讨论】:

以上是关于错误:数据源必须是字典 (dplyr)的主要内容,如果未能解决你的问题,请参考以下文章

字典到数据框错误:“如果使用所有标量值,则必须传递索引”

使用 dplyr 绑定数据库中的行

为什么Rstudio数据查看器过滤被dplyr分组表破坏?

R:错误:在 dplyr 中使用 unnest 时长度不兼容

R Shiny Reactive 值,dplyr 过滤器错误?

R dplyr,将 mutate 与 na.omit 一起使用会导致错误大小不兼容 (%d)