从 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))))