我有一个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功能,因为我必须这样做很多巨大的数据帧。
您可以使用.
来引用整个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