r - 从 dplyr 管道中的计算中排除当前观察
问题描述
我想从我在 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
推荐阅读
- php - Bootstrap - 使用 php 的手风琴风格错误
- javascript - 从四个类别之一随机输出图像的脚本,为什么这不起作用?
- azure - 无法启动 Azure 免费试用,因为 MS 帐户既不存在又已经存在
- reverse-engineering - IL 程序集编辑后的“已停止工作”消息
- scala - 线程“main”中的异常 java.lang.NullPointerException com.databricks.dbutils_v1.DBUtilsHolder$$anon$1.invoke
- google-apps-script - 扫描工作表文件以获取某些单元格值,然后将相应的电子表格 ID 放入某些单元格中
- python - 如何从 SymPy 符号表达式中删除 (1) 的系数?
- powershell - 在多台计算机上并行运行调用命令脚本
- rocket.chat - 无法在 Rocketchat 中获取正确的消息 ID
- php - 它适用于我的在线数据库老师,但不适用于我,尽管我的 mysql 和代码与她的相同