在将函数应用于dplyr管道中的数据之前,我想从任何给定的当前观察值中减去我选择的数字。
例如,让我们计算a)基于实际观察值的平均值和b)从当前观察值减去.10时的平均值。该解决方案应适用于其他计算或函数。
比方说,我们看一下三个不同冰(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现在我想添加两列: 1)基于三个冰的真实观测结果,当天的平均冰价格。2)如果当前行中的冰价格降低(=从当前价格观测值中减去.10 ),则当天的平均冰价格。
1)对我来说很清楚,但我如何添加2)?
da = da %>%
group_by(day) %>%
mutate(mean_dayprice = mean(price),
mean_dayprice_lower = ?)例如,在第一行中,mean_dayprice_lower将由:((1.60-.10)+2.10+.50)/3 = 1.36666给出
发布于 2020-06-07 19:56:17
对于您的特定问题,您可以简单地计算mean(price - 0.1)。
但是,一般来说,您可以使用以下方法。由于所需的操作在移位中没有矢量化(即-0.10),因此可以在mutate中使用purrr::map
da %>%
group_by(day) %>%
mutate(mean_dayprice = mean(price),
mean_dayprice_lower = purrr::map_dbl(1:n(), ~mean(price - if_else(1:n() == .x, 0.1, 0))))发布于 2020-06-07 19:52:24
无论条目是什么,第二列将始终减少0.1 / n,其中n是组中的条目数量。所以你可以这样做:
da %>%
group_by(day) %>%
mutate(mean_dayprice = mean(price),
mean_dayprice_lower = mean_dayprice-0.1/n())
# A tibble: 9 x 5
# Groups: day [3]
ice_id day price mean_dayprice mean_dayprice_lower
<dbl> <dbl> <dbl> <dbl> <dbl>
1 1 1 1.6 1.4 1.37
2 1 2 1.9 1.45 1.42
3 1 3 1.8 1.48 1.45
4 2 1 2.1 1.4 1.37
5 2 2 2.05 1.45 1.42
6 2 3 2.3 1.48 1.45
7 3 1 0.5 1.4 1.37
8 3 2 0.4 1.45 1.42
9 3 3 0.35 1.48 1.45发布于 2020-06-07 19:54:41
除非我不明白这是很简单的。
library(dplyr)
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 <- da %>%
group_by(day) %>%
mutate(mean_dayprice = mean(price),
mean_dayprice_lower = mean(price - .1))
da
#> # A tibble: 9 x 5
#> # Groups: day [3]
#> ice_id day price mean_dayprice mean_dayprice_lower
#> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 1 1 1.6 1.4 1.3
#> 2 1 2 1.9 1.45 1.35
#> 3 1 3 1.8 1.48 1.38
#> 4 2 1 2.1 1.4 1.3
#> 5 2 2 2.05 1.45 1.35
#> 6 2 3 2.3 1.48 1.38
#> 7 3 1 0.5 1.4 1.3
#> 8 3 2 0.4 1.45 1.35
#> 9 3 3 0.35 1.48 1.38https://stackoverflow.com/questions/62244756
复制相似问题