R — использование dplyr mutate для выделения доли от общего числа

У меня есть набор данных о затратах на развертывание мобильной инфраструктуры 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) 

person Thirst for Knowledge    schedule 10.10.2016    source источник


Ответы (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)

person parksw3    schedule 10.10.2016