我有一个显示日期,购买和再购买(减号)的数据框
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。
答案 0 :(得分:2)
使用 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"
选择日期的purchase_sum为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 :(得分:1)
一种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"
答案 2 :(得分:1)
使用dplyr
的一个选项可以是group_by
sales_month
和purchase_sum
的绝对值,然后选择{{1} 1}}。
sign