У меня есть фрейм данных, показывающий даты, покупки и повторные покупки (знак минус)
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 по умолчанию.
Одна 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"
Одним из вариантов использования 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"
С основание:
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"
@ Ронак Шах, спасибо за ваши замечания, я думаю, что исправил это :)