【问题标题】:Distinct in dplyr does not work (sometimes)dplyr 中的 Distinct 不起作用(有时)
【发布时间】:2019-07-09 09:07:49
【问题描述】:

我有以下从计数中获得的数据框。我使用dput 使数据框可用,然后编辑了数据框,因此有A 的副本。

df <- structure(list(Procedure = structure(c(4L, 1L, 2L, 3L), .Label = c("A", "A", "C", "D", "-1"), 
                                         class = "factor"), n = c(10717L, 4412L, 2058L, 1480L)), 
              class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -4L), .Names = c("Procedure", "n"))

print(df)

# A tibble: 4 x 2
  Procedure     n
  <fct>     <int>
1 D         10717
2 A          4412
3 A          2058
4 C          1480

现在我想对程序进行区分,只保留第一个A

df %>% 
  distinct(Procedure, .keep_all=TRUE)

# A tibble: 4 x 2
  Procedure     n
  <fct>     <int>
1 D         10717
2 A          4412
3 A          2058
4 C          1480

它不起作用。奇怪……

【问题讨论】:

  • 尝试将Procedure 转换为character ;)
  • @ 是的,但是我在文档中找不到任何地方表明它应该随着因素而有所不同。

标签: r dplyr tibble


【解决方案1】:

标签参数中有重复值 .Label = c("A", "A", "C", "D", "-1")。这是一个问题。顺便说一句,您初始化 tibble 的方式似乎很奇怪(我不确切知道您的目标,但仍然)

为什么不使用


df <- tibble(
    Procedure = c("D", "A", "A", "C"),
    n = c(10717L, 4412L, 2058L, 1480L)
)

【讨论】:

  • 这不是答案。你只是在陈述问题。此外,您看到的是数据框的dput。不是初始化它的方法
  • 不,这不是数据框的初始化。它是从计数获得(根据OP)的结果数据框,其中Procedure 列被设置为因子变量。因此,为了使distinct 起作用,需要先将特定列设置为字符。
  • @HongOoi,不是那么模糊。 Count 是dplyr 的实际count 函数(如果您看到结果列名为n)。我同意这个问题不清楚,但我仍然认为数据框的初始化不是这里的问题。
  • @HongOoi,没错。但是通过获取“计数”的结果并手动构建数据框是无法解决的。好吧,它会起作用,但它不能扩展,绝对不推荐
  • @David 请看我的帖子。我从您提供的代码开始,我没有收到您发布的错误消息。
【解决方案2】:

如果我们打印Procedure 列,我们可以看到a 有重复的级别,这对于distinct 函数来说是有问题的。

df$Procedure
[1] D A A C
Levels: A A C D -1
Warning message:
In print.factor(x) : duplicated level [2] in factor

一种解决方法是降低因子水平。我们可以使用factor 函数来实现这一点。另一种方法是将Procedure 列转换为字符。

df <- structure(list(Procedure = structure(c(4L, 1L, 2L, 3L), .Label = c("A", "A", "C", "D", "-1"), 
                                           class = "factor"), n = c(10717L, 4412L, 2058L, 1480L)), 
                class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -4L), .Names = c("Procedure", "n"))


library(tidyverse)

df %>% 
  mutate(Procedure = factor(Procedure)) %>%
  distinct(Procedure, .keep_all=TRUE)
# # A tibble: 3 x 2
#   Procedure     n
#   <fct>     <int>
# 1 D         10717
# 2 A          4412
# 3 C          1480

【讨论】:

  • @www.我仍然收到此错误Error in mutate_impl(.data, dots) : Evaluation error: factor level [2] is duplicated.。它在mutate 之后停止。
  • 我刚刚尝试在datacamp.com环境中运行代码,得到了同样的错误信息。
  • @David 也许tibble 包已经过时了。请将它更新到 cran (2.0.1) 上的最新版本,然后重试。
  • @www.好吧,我认为它会起作用,因为 dplyr 没有更新但仍然是同样的错误。
  • @www.嗯,一定是这样,我的 R 版本是 3.4.1,但是我不能更新我的 R 版本,因为它是一台工作计算机,我必须使用“网上商店”来进行应用程序。
猜你喜欢
  • 2020-04-05
  • 1970-01-01
  • 2012-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多