从 dplyr 管道中的计算中排除当前观察
Exclude current observation from computation in dplyr pipe
我想从我应用于 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 = ?)
如何在没有当前观测值的情况下添加平均价格?
对于删除当前观察并执行计算的一般情况,您可以使用 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
一个选项使用data.table
library(data.table)
setDT(da)[, .(mean_price = mean(price),
mean_price_without = sapply(day, function(x) mean(price[-x]))), ice_id]
我想从我应用于 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 = ?)
如何在没有当前观测值的情况下添加平均价格?
对于删除当前观察并执行计算的一般情况,您可以使用 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
一个选项使用data.table
library(data.table)
setDT(da)[, .(mean_price = mean(price),
mean_price_without = sapply(day, function(x) mean(price[-x]))), ice_id]