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

15

我对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
非常感谢您的帮助。

如果你逐行运行代码,你能确定哪一行触发了错误吗?由于在小数据集中无法复制该错误,我们需要更多关于它发生位置的信息。 - Z.Lin
小例子数据集和实际数据集之间一定有所不同。请仔细检查这两个数据集,看看是否有任何差异。您还可以使用dput函数分享整个或部分实际数据集,并在此处发布供其他人审查。 - www
很遗憾,我正在处理敏感数据,不允许分享。但我认为问题在于我的列比上面的DataFrame多。如果我在示例DataFrame中添加另一列,我就不能得到期望的输出。错误出现在代码的最后一行(select(-Head))。 - Manuel
6个回答

13

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


5
正如其他答案所述,这是由于名称不唯一引起的。通过修改您的示例(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)

3

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


1
这是由于在 rename 调用之后执行 select(-variable) 导致的。我遇到了同样的错误,当我删除了 "rename" 调用并执行相同的 select(-variable) 时它起作用了。
不知道为什么会出现这种情况,但这就是错误的触发器。

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

这是一个基本的R命令,用于删除“Head”列,与“select(-Head)”想要做的事情相同。
然后您可以运行其余的代码来连接数据框。
dt3 <- dt %>%
  left_join(dt2, by = c("hid", "syear", "relhead" = "Relation"))

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

0

我知道这个问题现在有点过时了,但是对于所有感兴趣的人来说,我认为问题在于plyr和dplyr中同名函数行为差异。因此,当你同时加载它们时,你可能会得到意想不到的结果。我也看到了group_by和summarize等函数存在这个问题。

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

更好的方法是不要使用plyr,因为dplyr已经覆盖了它,但我有一些使用plyr的旧代码,所以我不太愿意动它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接