Найти все индексы строк дат, которые (при группировке) составляют определенное значение

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

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 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
2
0
55
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Одна 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"

@ Ронак Шах, спасибо за ваши замечания, я думаю, что исправил это :)

tmfmnk 22.05.2019 12:17
Ответ принят как подходящий

Одним из вариантов использования dplyr может быть group_bysales_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"

С основание:

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 и где абс(сумма_покупки) > 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"

Другие вопросы по теме