Найти все строковые индексы дат, которые (при группировании) суммируют до определенного значения - PullRequest
2 голосов
/ 22 мая 2019

У меня есть фрейм данных, показывающий даты, покупки и повторные покупки (знак минус)

sales_month     purchase_sum
2019-01-01              256
2019-02-01              270
2019-02-01             -270
2019-03-01                0
2019-04-01               22
2019-04-01              -22
2019-05-01             -328
2019-05-01              328

Мне нужно получить индексы / значения дат, которые совершают покупку и повторную покупку, например (270, -270) соответственно

Я ожидаю вывод только тех дат, которые соответствуют purchase_sum значениям:

[1] "2019-02-01" "2019-04-01" "2019-05-01"

Код для генерации примера:

foo <- data.frame(sales_month = c("2019-01-01",
                                  "2019-02-01",
                                  "2019-02-01",
                                  "2019-03-01",
                                  "2019-04-01",
                                  "2019-04-01",
                                  "2019-05-01",
                                  "2019-05-01"),
                  purchase_sum = c(256, 270, -270,
                                   0, 22, -22, -328, 328),
                                   stringsAsFactors = FALSE)

Имейте в виду, что использование столбцов group_by, sales_month и summarize с sum может не работать, поскольку некоторые значения sales_month могут быть по умолчанию 0.

Ответы [ 3 ]

2 голосов
/ 22 мая 2019

С помощью base :

with(aggregate(cbind(a=purchase_sum, b=abs(purchase_sum)) ~ sales_month, foo, FUN=sum), sales_month[a==0 & b>0])
#[1] "2019-02-01" "2019-04-01" "2019-05-01"

выбирает даты, в которых значение_покупки даты равно 0 и где abs (purchase_sum)> 0

Или вы можете отсортировать сначалаи затем сравните, если в одну и ту же дату есть одно и то же число с другим знаком.

foo <- foo[order(foo[,1], abs(foo[,2])),]
foo[c(FALSE, foo[-nrow(foo),1] == foo[-1,1] & foo[-nrow(foo),2] == -foo[-1,2]),1]
#[1] "2019-02-01" "2019-04-01" "2019-05-01"
1 голос
/ 22 мая 2019

Одной из опций, использующих dplyr, может быть group_by sales_month и абсолютное значение purchase_sum и выбор дат, которые имеют более 1 sign из purchase_sum.

library(dplyr)

foo %>%
  group_by(sales_month, abs(purchase_sum)) %>%
  filter(n_distinct(sign(purchase_sum)) > 1) %>%
  pull(sales_month) %>% unique

#[1] "2019-02-01" "2019-04-01" "2019-05-01"
1 голос
/ 22 мая 2019

Одна dplyr возможность может быть:

df %>%
 group_by(sales_month, purchase_sum) %>%
 distinct() %>%
 group_by(sales_month, purchase_sum2 = abs(purchase_sum)) %>%
 filter(n() == 2) %>%
 ungroup() %>%
 select(-purchase_sum2)

  sales_month purchase_sum
  <chr>              <int>
1 2019-02-01           270
2 2019-02-01          -270
3 2019-04-01            22
4 2019-04-01           -22
5 2019-05-01          -328
6 2019-05-01           328

Или:

df %>%
 group_by(sales_month, purchase_sum) %>%
 distinct() %>%
 group_by(sales_month, purchase_sum2 = abs(purchase_sum)) %>%
 filter(n() == 2 & row_number() == 1) %>%
 pull(sales_month)

[1] "2019-02-01" "2019-04-01" "2019-05-01"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...