使用 group_by 和 summarise 时出现重复行

Posted

技术标签:

【中文标题】使用 group_by 和 summarise 时出现重复行【英文标题】:Duplicated rows emerging when using group_by and summarise 【发布时间】:2015-07-27 13:47:06 【问题描述】:

我有一个数据表,当使用 summarise 函数和 group_by 时,我得到了重复的行。

我将举一个简单的例子来说明我的问题。 首先,我使用 group_by 和 mutate 来为每个 id 添加“value”的总和。

dt <- data.table(id = rep(1:5, each=10), cpc = rep((0.1*seq(5)), each=2), value = 1:50)

dt2 <- dt %>%
  group_by(id) %>%
  mutate(SumValue = sum(value))


Source: local data table [50 x 4]

   id cpc value SumValue
1   1 0.1     1       55
2   1 0.1     2       55
3   1 0.2     3       55
4   1 0.2     4       55
5   1 0.3     5       55
6   1 0.3     6       55
7   1 0.4     7       55
8   1 0.4     8       55
9   1 0.5     9       55
10  1 0.5    10       55
.. .. ...   ...      ...

到目前为止,没有任何问题。 但在那之后,当我对每个 id、cpc 组合执行 group_by 并使用 summarise 时,输出结果与我预期的不同。 数字是正确的,但是有重复的行。

dt2 %>%
  group_by(id, cpc) %>%
  summarise(count = n(), SumValue = SumValue)

Source: local data table [50 x 4]
Groups: id

   id cpc count SumValue
1   1 0.1     2       55
2   1 0.1     2       55
3   1 0.2     2       55
4   1 0.2     2       55
5   1 0.3     2       55
6   1 0.3     2       55
7   1 0.4     2       55
8   1 0.4     2       55
9   1 0.5     2       55
10  1 0.5     2       55
.. .. ...   ...      ...

使用 unique() 可以得到想要的结果,但我认为这不是必需的。

dt2 %>%
  group_by(id, cpc) %>%
  summarise(count = n(), SumValue = SumValue) %>%
  unique()

Source: local data table [25 x 4]
Groups: id

   id cpc count SumValue
1   1 0.1     2       55
2   1 0.2     2       55
3   1 0.3     2       55
4   1 0.4     2       55
5   1 0.5     2       55
6   2 0.1     2      155
7   2 0.2     2      155
8   2 0.3     2      155
9   2 0.4     2      155
10  2 0.5     2      155
.. .. ...   ...      ...

我认为当 add=FALSE 时 group_by 设置组,所以我不知道为什么会出现重复的行。

【问题讨论】:

试试dt2 %&gt;% group_by(id, cpc) %&gt;% summarise(count=n(), SumValue=SumValue[1L])。在dt2 中,您使用mutate 创建了SumValue,因此每个id 必须有多个具有相同SumValue 的行 感谢 akrun,您的解决方案似乎可以在不使用 unique() 的情况下工作。现在我发现问题出在 SumValue=SumValue 部分。 【参考方案1】:

我不确定确切的问题,但是当您将向量分配给汇总变量时,您通常需要选择向量的一个元素。因此,在这种情况下,您需要选择“SumValue”的哪个值分配给汇总的“SumValue”。我通常只使用变量 [1] 来执行此操作,但首先(变量)可能会更好。这会为您提供您正在寻找的结果吗?

dt <- data_frame(id = rep(1:5, each=10), 
                 cpc = rep((0.1*seq(5)), each=10), 
                 value = 1:50)
dt2 <- dt %>%
  group_by(id) %>%
  mutate(SumValue = sum(value))
dt2

dt2 %>%
  group_by(id, cpc) %>%
  summarise(count = n(), SumValue = first(SumValue))

【讨论】:

我忘记了“SumValue”是一个向量,我应该选择其中的一个元素。感谢您指出 Shorpy。【参考方案2】:

尝试以这种方式使用 unique。不确定这是否会有所帮助。

R> df <- data.frame(a=c(1,2,3,4,3,2), b=c(4,5,6,6,4,3)) 
R> unique(unlist(df)) 
[1] 1 2 3 4 5 6 

【讨论】:

以上是关于使用 group_by 和 summarise 时出现重复行的主要内容,如果未能解决你的问题,请参考以下文章

R语言dplyr包使用dplyr函数使用group_by函数summarise函数和mutate函数计算分组占比实战

为啥 ``mean`` 函数不能在函数环境中与 ``group_by %>% summarise`` 一起正常工作?

R语言dplyr包使用group_by函数和summarise函数计算单分类变量分组均值ggplot2可视化线图(line plot)并设置线条类型为虚线(set line types)

R语言dplyr包使用group_by函数和summarise函数计算单分类变量分组均值ggplot2可视化线图(line plot)并设置线条类型为虚线(set line types)

R语言使用dplyr包使用group_by函数summarise函数和mutate函数计算分组下的均值标准差样本个数以及分组均值的95%执行区间对应的下限值和上限值(Calculate CI)

为啥我的 dplyr group_by & summarise 不能正常工作? (名称与 plyr 冲突)