提问者:小点点

对不包含要group_by的变量的所有行使用dplyr中的group_by和汇总


我有一个data. frame,例如

df1 <- data.frame(id = c("A", "A", "B", "B", "B"), 
                  cost = c(100, 10, 120, 102, 102)

我知道我可以用

df1.a <- group_by(df1, id) %>%
    summarise(no.c = n(), 
              m.costs = mean(cost))

通过id计算观察数和平均值。如果我想计算不等于ID的所有行的观察数和平均值,我该怎么做呢?例如,它会给我3作为观察值而不是A,2作为观察值而不是B。

我想使用dplyr软件包和group_by功能,因为我必须这样做很多巨大的数据帧。


共2个答案

匿名用户

您可以使用.来引用整个data. frame,它可以让您计算组和整体之间的差异:

df1 %>% group_by(id) %>% 
    summarise(n = n(), 
              n_other = nrow(.) - n, 
              mean_cost = mean(cost), 
              mean_other = (sum(.$cost) - sum(cost)) / n_other)

## # A tibble: 2 × 5
##       id     n n_other mean_cost mean_other
##   <fctr> <int>   <int>     <dbl>      <dbl>
## 1      A     2       3        55        108
## 2      B     3       2       108         55

从结果中可以看出,对于两个组,您可以只使用rev,但这种方法可以轻松扩展到更多组或计算。

匿名用户

寻找这样的东西?这首先计算总成本和总行数,然后减去每组的总成本和总行数,并取成本的平均值:

sumCost = sum(df1$cost)
totRows = nrow(df1)

df1 %>% 
        group_by(id) %>% 
        summarise(no.c = totRows - n(), 
                  m.costs = (sumCost - sum(cost))/no.c)

# A tibble: 2 x 3
#      id  no.c m.costs
#  <fctr> <int>   <dbl>
#1      A     3     108
#2      B     2      55