агрегирование данных в R с присвоением фиктивной переменной по условию - PullRequest
0 голосов
/ 04 марта 2019

У меня есть следующий набор данных

 mydata=structure(list(id = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), ad_id = c(111L, 111L, 111L, 
111L, 1111L, 1111L, 11111L, 11111L, 11111L, 111L, 111L, 1111L, 
1111L, 11111L, 11111L, 11111L, 111111L, 111111L), price = c(1L, 
0L, 1L, 0L, 2L, 0L, 3L, 0L, 0L, 1L, 0L, 2L, 0L, 3L, 0L, 0L, 1L, 
0L), rev = c(2L, 0L, 0L, 2L, 3L, 3L, 4L, 4L, 4L, 2L, 2L, 3L, 
3L, 4L, 4L, 4L, 0L, 0L), data = structure(c(1L, 2L, 2L, 3L, 1L, 
3L, 1L, 3L, 4L, 1L, 3L, 1L, 3L, 1L, 3L, 4L, 1L, 3L), .Label = c("01.01.2018", 
"01.02.2018", "01.03.2018", "02.03.2018"), class = "factor")), .Names = c("id", 
"ad_id", "price", "rev", "data"), class = "data.frame", row.names = c(NA, 
-18L))

Как создать фиктивную переменную в соответствии со следующей логикой: Для каждого id и ad_id мне нужно агрегировать по цене данных и оборотам.Каждый ad_id имеет столбец даты (данные).

Если для каждого id и ad_id за период до 90 дней (столбец данных -dmy) оборот больше, чем цена, тофлаг установлен в 1, в противном случае флаг равен 0. В этом воспроизводимом примере я просто беру 1 id и 4 ad_id.В агрегированном виде в виде суммы это представление

  id  ad_id price rev
1  1    111     2   4
2  1   1111     2   6
3  1  11111     3  12
4  1 111111     1   0

Таким образом, для id=1 все ad_id (кроме ad_id = 111111) удовлетворяют rev> цене, поэтому в исходных данных ad_id = 111, 1111, 111111 должен иметь флаг = 1и 111111 должен иметь флаг = 0.

Вот требуемый вывод:

   id  ad_id price rev       data flag
1   1    111     1   2 01.01.2018    1
2   1    111     0   0 01.02.2018    1
3   1    111     1   0 01.02.2018    1
4   1    111     0   2 01.03.2018    1
5   1   1111     2   3 01.01.2018    1
6   1   1111     0   3 01.03.2018    1
7   1  11111     3   4 01.01.2018    1
8   1  11111     0   4 01.03.2018    1
9   1  11111     0   4 02.03.2018    1
10  1 111111     1   0 01.01.2018    0
11  1 111111     0   0 01.03.2018    0

Как выполнить такое условие

1 Ответ

0 голосов
/ 04 марта 2019

Я не уверен, правильно ли вас понял, но это то, что вы ищете:

library(tidyverse)

mydata %>% as_tibble() %>% 
  group_by(id, ad_id) %>% 
  summarise_at(vars("price", "rev"), sum) %>% 
  mutate(flag = if_else(price > rev, 0, 1)) %>% 
  select(id, ad_id, flag) %>% 
  left_join(mydata, ., by = c("id", "ad_id"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...