【问题标题】:Exclude current observation from computation in dplyr pipe从 dplyr 管道中的计算中排除当前观察
【发布时间】:2020-05-30 14:26:15
【问题描述】:

我想从我应用于 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 = ?)

如何在没有当前观察值的情况下添加平均价格?

【问题讨论】:

    标签: r function dplyr pipe transformation


    【解决方案1】:

    对于删除当前观察并执行计算的一般情况,您可以使用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 
    

    【讨论】:

      【解决方案2】:

      使用data.table的选项

      library(data.table)
      setDT(da)[, .(mean_price = mean(price),
                   mean_price_without = sapply(day, function(x) mean(price[-x]))), ice_id]
      

      【讨论】:

        猜你喜欢
        • 2018-08-27
        • 2016-06-21
        • 1970-01-01
        • 2020-09-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-02
        相关资源
        最近更新 更多