首页 > 解决方案 > 如何在 R 中的 dplyr 包中保留分组变量的真实值

问题描述

我的数据是这样的:

 group <- c(21, 21, 21, 9, 9, 9, 25, 25, 25)
 a <- c(8,3,5,6,8,3,3,9,3)
 b <- c(4,9,0,1,3,5,6,1,1)
 c <- c(1,7,2,5,6,8,4,8,6)
 value <- c(23,34,43,52,65,21,12,89,76)
 df <- data.frame(group,a,b,c,value)

我对其应用了以下功能。

 out <- df %>%
   select(group, a, b, value) %>%
   group_by(group = gl(n()/3, 3)) %>%
   summarise(res = mean(value), a=a[1], b=b[1])
 print(out)

然后我得到以下结果。

 group   res     a     b
  <fct> <dbl> <dbl> <dbl>
1  1      33.3     8     4
2  2      46       6     1
3  3      59       3     6
> 

我的问题是如何像这样在输出 df 中保持 ID 的原始值

 group   res     a     b
  <fct> <dbl> <dbl> <dbl>
1  21      33.3     8     4
2   9      46       6     1
3  25      59       3     6
>

提前致谢!

标签: rgroup-bydplyr

解决方案


问题是您group在调用中覆盖了您的变量,group_by因此您没有获得原始变量。您需要使用其他名称,group_by然后进行计算。

我们可以使用两个选项 -

1) 有summarise

library(dplyr)

df %>%
  group_by(group1 = gl(n()/3, 3)) %>%
  summarise(res = mean(value), a=a[1], b=b[1], group = group[1])

#  group1   res     a     b group
#  <fct>  <dbl> <dbl> <dbl> <dbl>
#1 1       33.3     8     4    21
#2 2       46       6     1     9
#3 3       59       3     6    25

2) 有mutate

df %>%
  select(group, a, b, value) %>%
  group_by(group1 = gl(n()/3, 3)) %>%
  mutate(res = mean(value), a=a[1], b=b[1]) %>%
  slice(1) 

在这两种情况下,如果您不再对保留分组变量感兴趣,请ungroup() %>% select(-group1)删除它。


推荐阅读