【问题标题】:Mutate() + group_by() doesn't work tidyverse [duplicate]mutate() + group_by() 不起作用 tidyverse [重复]
【发布时间】:2021-05-01 08:54:44
【问题描述】:

我知道我的问题很容易回答。 但我什么都试过了。 以下代码有什么问题? 为什么不是 grouping_by(name)? .... 有管子和没有管子我都试过了。

df <- data.frame(name= c("jose", "jose", "maria", "maria", "maria", "pedro"),
                 values= c(rep(1,6)), stringsAsFactors = T)

df1 <- mutate(df, N=sum(values))  # summing without grouping

# without pipe
df <- group_by(df, name)           # grouping $name 
df2 <- mutate(df, N= sum(values))  # summing by group

df1 == df2    # there's no difference between results: group_by() is not working

#     name values    N
#[1,] TRUE   TRUE TRUE
#[2,] TRUE   TRUE TRUE
#[3,] TRUE   TRUE TRUE
#[4,] TRUE   TRUE TRUE
#[5,] TRUE   TRUE TRUE
#[6,] TRUE   TRUE TRUE


# with pipe
df3 <- df %>% group_by(name)  %>%  # grouping $name 
          mutate(N= sum(values))   # summing by group

df1 == df3    # there's no difference between results: group_by() is not working

#     name values    N
#[1,] TRUE   TRUE TRUE
#[2,] TRUE   TRUE TRUE
#[3,] TRUE   TRUE TRUE
#[4,] TRUE   TRUE TRUE
#[5,] TRUE   TRUE TRUE
#[6,] TRUE   TRUE TRUE

我想要的输出是一个新列,其中包含按组的值总和:

df$N <- c(2,2,3,3,3,1) # DESIRED

我得到的输出是没有分组的总和:

df$N <- c(6,6,6,6,6,6) # NOT DESIRED

【问题讨论】:

  • 我实际上在N 列中得到了FALSE,但我确实听到了有关如何在较新版本中调整group_by 行为的对话,请在mutate 语句之后尝试ungroup 和看看情况是否有变化。
  • 你没有指定你想要的输出,但我怀疑你想要summarise(N=sum(values), .groups="drop")而不是mutate(N=sum(values))
  • 我想要的输出是一个新列,其中包含按组的值总和:df$N
  • 当我运行你的代码时,我得到了想要的输出,即df3$N2 2 3 3 3 1。您很可能已经加载了 plyr 库,它掩盖了 mutate 函数。尝试使用dplyr::mutatedf3 &lt;- df %&gt;% group_by(name) %&gt;% dplyr::mutate(N= sum(values))

标签: r group-by tidyverse dplyr


【解决方案1】:

菲德尔,你大部分时间都在那里...... 我将第一个变异放在名为 N 的列中,将分组输出放在 N2 列中。 这样你就可以看到group_by() 是如何工作的。在分组的df上使用summary会为每个分组键返回一行,即在您的情况下为名称。因此,使用 mutate 是您正在寻找的解决方案。

df %>% 
  mutate(N = sum(values)) %>% 
  group_by(name) %>% 
  mutate(N2 = sum(values)) %>%
  ungroup() # to remove grouping

这会产生

  name  values     N    N2
  <fct>  <dbl> <dbl> <dbl>
1 jose       1     6     2
2 jose       1     6     2
3 maria      1     6     3
4 maria      1     6     3
5 maria      1     6     3
6 pedro      1     6     1

【讨论】:

  • 你不明白我的意思。这段代码在这里不起作用。两列输出相同。我需要通过其他方式找到这个输出,因为 grop_by() + mutate() 不起作用。你的 tidyverse 版本是什么?
  • 我的 tidyverse 版本是 1.3.0。上面已经提到,您可能已经屏蔽了加载其他包的功能。重启 RStudio,只加载 tidyverse/dplyr 并执行管道。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-13
  • 1970-01-01
  • 2017-10-07
  • 2017-02-20
  • 1970-01-01
相关资源
最近更新 更多