【问题标题】:R - using dplyr mutate to allocate a proportion of a total numberR - 使用 dplyr mutate 分配总数的一部分
【发布时间】:2017-02-18 23:07:56
【问题描述】:

我有一套为不同邮政编码地区推出 5G 移动基础设施的成本数据集:

observation <- c(1:10)
pop.d.rank  <- c(1:10)
cost  <- c(101:110)
all <- data.frame(observation,pop.d.rank,cost) 

然后我想看看,在一定的年投资额下,有多少人可以被一定数量的可用资金覆盖。假设年度投资如下:

annual.investment <- 500

下面我然后使用 dplyr 尝试根据成本变量将这个年度投资分配到数据中的不同地理类型区域:

all <- all %>% group_by(pop.d.rank) %>% 
       mutate(capital_allocated.5G = diff(c(0, pmin(cumsum(cost), annual.investment)))) %>%
       mutate(capital_percentage.5G = capital_allocated.5G / cost * 100)

但是,这里的问题是,每次将 500 的年度投资金额分配给数据中的每个观察值,而不是作为所有观察值的总金额。关于如何更改此代码以执行此操作的任何建议?

这就是数据之后的样子:

observation <- c(1:10)
pop.d.rank  <- c(1:10)
cost  <- c(101:110)
capital_allocated.5G <- c(101, 102, 103, 104, 90, 0, 0, 0, 0, 0)
capital_percentage.5G <- c(100, 100, 100, 100, 86, 0, 0, 0, 0, 0)
example.output <- data.frame(observation,pop.d.rank,cost, capital_allocated.5G, capital_percentage.5G) 

【问题讨论】:

    标签: r dplyr cumulative-sum


    【解决方案1】:

    你可以使用transform来做到这一点

    all <- transform(all, 
              capital_allocated.5G = diff(c(0, pmin(cumsum(cost), annual.investment))))
    all <- transform(all,
                     capital_percentage.5G = capital_allocated.5G / cost * 100)
    

    或者为了避免重复你的代码,你可以这样做:

    all <- with(all,{
        capital_allocated.5G = diff(c(0, pmin(cumsum(cost), annual.investment)))
        capital_percentage.5G = capital_allocated.5G / cost * 100
        return(cbind(all, capital_allocated.5G,
                     capital_percentage.5G))
    })
    

    它们都给你相同的输出:

    ##   observation pop.d.rank cost capital_allocated.5G capital_percentage.5G
    ## 1            1          1  101                  101             100.00000
    ## 2            2          2  102                  102             100.00000
    ## 3            3          3  103                  103             100.00000
    ## 4            4          4  104                  104             100.00000
    ## 5            5          5  105                   90              85.71429
    ## 6            6          6  106                    0               0.00000
    ## 7            7          7  107                    0               0.00000
    ## 8            8          8  108                    0               0.00000
    ## 9            9          9  109                    0               0.00000
    ## 10          10         10  110                    0               0.00000
    

    此外,如果您删除 group_by(pop.d.rank),您的代码也可以正常工作

    【讨论】:

      猜你喜欢
      • 2017-05-22
      • 1970-01-01
      • 1970-01-01
      • 2015-03-20
      • 1970-01-01
      • 1970-01-01
      • 2015-10-06
      • 1970-01-01
      • 2017-05-31
      相关资源
      最近更新 更多