首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从dplyr管道中的当前观测值中减去特定数字

从dplyr管道中的当前观测值中减去特定数字
EN

Stack Overflow用户
提问于 2020-06-07 19:40:29
回答 3查看 138关注 0票数 4

在将函数应用于dplyr管道中的数据之前,我想从任何给定的当前观察值中减去我选择的数字。

例如,让我们计算a)基于实际观察值的平均值和b)从当前观察值减去.10时的平均值。该解决方案应适用于其他计算或函数。

比方说,我们看一下三个不同冰(ice_id =冰标识符)在三个不同日期(天)的冰价格。

代码语言:javascript
复制
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)?

代码语言:javascript
复制
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给出

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-06-07 19:56:17

对于您的特定问题,您可以简单地计算mean(price - 0.1)

但是,一般来说,您可以使用以下方法。由于所需的操作在移位中没有矢量化(即-0.10),因此可以在mutate中使用purrr::map

代码语言:javascript
复制
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))))
票数 3
EN

Stack Overflow用户

发布于 2020-06-07 19:52:24

无论条目是什么,第二列将始终减少0.1 / n,其中n是组中的条目数量。所以你可以这样做:

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2020-06-07 19:54:41

除非我不明白这是很简单的。

代码语言:javascript
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62244756

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档