r-如何求和某些部分重复的行,而不是所有重复的行(基于条件语句)



我当前的数据集如下所示:

INVOICE_ID  MONTH  AMOUNT
1            2     -500
1            2     -500
1            2     1000
1            3     30
1            3     10
1            3     -30
2            5     40
2            5     60
3            4     50
....

我想把它转换成这样:

INVOICE_ID  MONTH  AMOUNT
1            2      0
1            3     10
2            5      40
2            5      60
3            4      50

因此,对于具有INVOICE_ID和MONTH的行,如果与具有相同INVOICE_ID和MONTH且AMOUNT为负的行相匹配,我希望将这些行合并为一行,即所有匹配行中AMOUNT的总和。但是,对于具有INVOICE_ID和MONTH的行,如果这些行与具有相同INVOICE-ID和MONSH但只有正AMOUNT的行相匹配,则我希望保持此数据不变。

我不是一个很好的R用户,所以这感觉超出了我的水平,我不知道如何处理它。任何帮助都将不胜感激!

使用dplyr,您可以执行以下操作:

library(dplyr)
x <- data.frame(INVOICE_ID = c(1, 1,1,1,1,1,2,2,3), 
MONTH = c(2, 2,2,3,3,3,5,5,4), 
AMOUNT = c(-500, -500,1000,30,10,-30,40,60,50))
x %>% group_by(INVOICE_ID, MONTH) %>% 
mutate(check = ifelse(any(AMOUNT < 0), 1, 0),
AMOUNT = ifelse(check == 1, sum(AMOUNT), AMOUNT)) %>% 
select(-check) %>% 
distinct()
# A tibble: 5 x 3
# Groups:   INVOICE_ID, MONTH [4]
INVOICE_ID MONTH AMOUNT
<dbl> <dbl>  <dbl>
1          1     2      0
2          1     3     10
3          2     5     40
4          2     5     60
5          3     4     50

以下是dplyr的方法。首先按INVOICE_IDMONTH分组。然后用any(AMOUNT < 0)确定该月中是否有任何AMOUNT为负。我将添加!,因为我想在下一步中进行累加。然后,使用cumsum为非负发票制作ID。最后,用INVOICE_IDMONTH和我们新的ID进行重组。然后是summariseAMOUNT

library(dplyr)
data %>%
group_by(INVOICE_ID,MONTH) %>%
mutate(ID = !any(AMOUNT < 0), ID = cumsum(ID)) %>%
group_by(INVOICE_ID,MONTH,ID) %>%
dplyr::summarise(across(AMOUNT,sum))
## A tibble: 5 x 4
## Groups:   INVOICE_ID, MONTH [4]
#  INVOICE_ID MONTH    ID AMOUNT
#       <int> <int> <int>  <int>
#1          1     2     0      0
#2          1     3     0     10
#3          2     5     1     40
#4          2     5     2     60
#5          3     4     1     50

您可以使用dplyr::select(-ID)删除ID。

最新更新