R中的数据聚合,并按条件分配虚拟变量

时间:2019-03-04 12:28:15

标签: r dplyr

我有以下数据集

 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))

如何根据以下逻辑创建虚拟变量: 对于每个idad_id,我需要按数据价格和转速进行汇总。每个ad_id都有一个日期列(数据)。

如果对于idad_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 和长达90天(数据列-d-m-y)的rev大于价格,则该标志设置为1,否则该标志为0。 在这个可重现的示例中,我仅输入1个id和4个ad_id。 以汇总形式汇总的是视图

id=1

因此对于ad_id,所有ad_id = 111111(除ad_id = 111, 1111, 111111之外)都满足rev> price,因此在初始数据中 111111必须具有标志= 1,而 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 必须具有标志= 0。

这是所需的输出:

[error] 33#0: *46 upstream timed out (110:Connection timed out) while connecting to updstream, client:10.1.13.1, server: , request: "GET /api/locations HTTP1.1", upstream: "http://172.30.125.241:9012/locations", host: "rms-ui-dev-rms.dev.alpha.uat.mycompany.com", referrer: "http://rms-ui-dev-rms.dev.alpha.uat.mycompany.com/login"

如何执行这种条件

1 个答案:

答案 0 :(得分:1)

我不确定是否正确理解了您,但这是您要寻找的内容吗

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"))