查找(分组时)总和为某个值的日期的所有行索引

时间:2019-05-22 09:48:29

标签: r dataframe

我有一个显示日期,购买和再购买(减号)的数据框

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_bysales_month列和summarizesum一起使用可能不起作用,因为某些sales_month值默认为0。

3 个答案:

答案 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_monthpurchase_sum的绝对值,然后选择{{1} 1}}。

sign