我想从应用于dplyr管道中的数据的函数中排除当前的观察值,因为我想知道没有这个观察值的值。
为了简单起见,让我们计算包括当前观察值和排除该观察值的平均值。该解决方案应该适用于其他计算或函数(在我的例子中,来自DescTools包的Gini函数)。
假设我们查看三个不同冰(ice_id =冰标识符)在三个不同日期(天)的冰价格。
da <- data.frame(ice_id = c(1,1,1,2,2,2,3,3,3), day = c(1,2,3,1,2,3,1,2,3), price = c(1.60,1.90,1.80,2.10,2.05,2.30,0.50,0.40,0.35))
da
ice_id day price
1 1 1 1.60
2 1 2 1.90
3 1 3 1.80
4 2 1 2.10
5 2 2 2.05
6 2 3 2.30
7 3 1 0.50
8 3 2 0.40
9 3 3 0.35我想添加一列表示包括这一天在内的冰的平均价格,以及一列表示不包括这一天的冰的平均价格。
da = da %>%
group_by(ice_id) %>%
mutate(mean_price = mean(price),
mean_price_without = ?)如果没有当前的观察结果,我如何添加平均价格?
发布于 2020-05-30 22:29:31
对于移除当前观察值并执行计算的一般情况,您可以使用map_dbl
library(dplyr)
library(purrr)
da %>%
group_by(ice_id) %>%
mutate(mean_price = mean(price),
mean_price_without = map_dbl(day, ~mean(price[-.x])))
#Or
#mean_price_without = map_dbl(day, ~mean(price[day != .x])))
#mean_price_without = map_dbl(row_number(), ~mean(price[-.x])))
# ice_id day price mean_price mean_price_without
# <dbl> <dbl> <dbl> <dbl> <dbl>
#1 1 1 1.6 1.77 1.85
#2 1 2 1.9 1.77 1.7
#3 1 3 1.8 1.77 1.75
#4 2 1 2.1 2.15 2.17
#5 2 2 2.05 2.15 2.2
#6 2 3 2.3 2.15 2.08
#7 3 1 0.5 0.417 0.375
#8 3 2 0.4 0.417 0.425
#9 3 3 0.35 0.417 0.45 发布于 2020-05-31 02:57:13
使用data.table的选项
library(data.table)
setDT(da)[, .(mean_price = mean(price),
mean_price_without = sapply(day, function(x) mean(price[-x]))), ice_id]https://stackoverflow.com/questions/62103829
复制相似问题