如何在R中的dplyr包中保留分组变量的实值

时间:2019-05-01 11:17:02

标签: r group-by 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
>

谢谢!

1 个答案:

答案 0 :(得分:2)

问题是您在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)将其删除。