从 dplyr 管道中的当前观察值中减去特定数字
Subtract specific number from current observationin dplyr pipe
在对 dplyr 管道中的数据应用函数之前,我想从任何给定的当前观察中减去我选择的数字。
例如,让我们计算均值 a) 基于真实观察和 b) 从当前观察中减去 .10。该解决方案应该适用于其他计算或功能。
比方说,我们在三个不同的日子(天)查看三种不同冰(ice_id = ice identifier)的冰价。
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) 当天的平均冰价,如果只有当前行中的冰价格会低 0.10(= 从当前价格观察中减去 0.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
无论条目如何,您的第二列将始终减少 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
除非我不明白它就像...一样简单
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.38
对于您的特定问题,您可以简单地计算 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))))
在对 dplyr 管道中的数据应用函数之前,我想从任何给定的当前观察中减去我选择的数字。
例如,让我们计算均值 a) 基于真实观察和 b) 从当前观察中减去 .10。该解决方案应该适用于其他计算或功能。
比方说,我们在三个不同的日子(天)查看三种不同冰(ice_id = ice identifier)的冰价。
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) 当天的平均冰价,如果只有当前行中的冰价格会低 0.10(= 从当前价格观察中减去 0.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
无论条目如何,您的第二列将始终减少 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
除非我不明白它就像...一样简单
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.38
对于您的特定问题,您可以简单地计算 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))))