Рассчитать выручку за каждый месяц по сумме выручки в г - PullRequest
0 голосов
/ 07 ноября 2019

Допустим, консалтинг ежемесячно публикует общие доходы фирм A и B в области альфа и бета, данные могут выглядеть следующим образом:

# generate data

foo <- expand.grid(month = 1:3, region = c("alpha", "beta"), firm = c("A", "B"), stringsAsFactors = FALSE)
foo <- foo[order(foo$month, foo$region),]
rownames(foo) <- 1:nrow(foo)
foo <- foo[c(-1,-6),]
revenue <- c(1.5, 2, 2.1, 1.2, 3, 5.5, 3.2, 5, 5, 6)
foo <- cbind(foo, revenue)
foo

##    month region firm revenue
## 2      1  alpha    B     1.5
## 3      1   beta    A     2.0
## 4      1   beta    B     2.1
## 5      2  alpha    A     1.2
## 7      2   beta    A     3.0
## 8      2   beta    B     5.5
## 9      3  alpha    A     3.2
## 10     3  alpha    B     5.0
## 11     3   beta    A     5.0
## 12     3   beta    B     6.0

что я хочу делать, это рассчитывать доходы в каждом месяце. Но я не могу справиться со всеми этими ситуациями:

  1. В январе выручка за этот месяц равна общей выручке;
  2. Для нового филиала месяц, в котором он впервые показался, для других выглядит как январь;
  3. И некоторые данные будут потеряны, в следующем месяце выручка должна составлять NA.

В основном, результат:

result <- c(1.5, 2, 2.1, 1.2, 1, 3.4, 2, NA, 2, 0.5)
res <- cbind(foo, result)
res

##    month region firm revenue result
## 2      1  alpha    B     1.5    1.5
## 3      1   beta    A     2.0    2.0
## 4      1   beta    B     2.1    2.1
## 5      2  alpha    A     1.2    1.2  ## a new branch launched by A at alpha in Feb.
## 7      2   beta    A     3.0    1.0
## 8      2   beta    B     5.5    3.4
## 9      3  alpha    A     3.2    2.0
## 10     3  alpha    B     5.0     NA  ## the data of B at alpha in Feb. is missing
## 11     3   beta    A     5.0    2.0
## 12     3   beta    B     6.0    0.5

Заранее спасибо ~

1 Ответ

0 голосов
/ 08 ноября 2019

Я не совсем уверен, что это то, что вы ищете, но, возможно, это будет полезно. Я предполагаю, что revenue является совокупным / кумулятивным для каждой комбинации фирмы / региона.

Во-первых, я бы отметил первое появление дохода (новый филиал, одно из ваших правил).

foo <- foo %>%
  group_by(region, firm) %>%
  mutate(first = first(month)) %>%
  ungroup()

Затем развернется и получит комбинации firm/region, заполнится NA и снова присоединится к фрейму данных. Вы можете группировать по region и firm и установить result в revenue, если месяц январь (1). В противном случае установите значение, отличное от последнего revenue.

Поскольку новая ветвь должна рассматриваться как январь, измените result на revenue, если месяц является first месяцем, а result был NA.

foo %>%
  expand(firm, nesting(region, month)) %>%
  left_join(foo) %>%
  group_by(region, firm) %>%
  mutate(result = ifelse(month == 1, revenue, revenue-lag(revenue))) %>%
  mutate(result = ifelse((is.na(result)) & (month == first), revenue, result)) %>%
  drop_na(revenue) %>%
  select(-first) %>%
  arrange(month, region)

# A tibble: 10 x 5
# Groups:   region, firm [4]
   firm  region month revenue result
   <chr> <chr>  <int>   <dbl>  <dbl>
 1 B     alpha      1     1.5    1.5
 2 A     beta       1     2      2  
 3 B     beta       1     2.1    2.1
 4 A     alpha      2     1.2    1.2
 5 A     beta       2     3      1  
 6 B     beta       2     5.5    3.4
 7 A     alpha      3     3.2    2  
 8 B     alpha      3     5     NA  
 9 A     beta       3     5      2  
10 B     beta       3     6      0.5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...