我当前的数据集如下所示:
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_ID
和MONTH
分组。然后用any(AMOUNT < 0)
确定该月中是否有任何AMOUNT
为负。我将添加!
,因为我想在下一步中进行累加。然后,使用cumsum
为非负发票制作ID。最后,用INVOICE_ID
、MONTH
和我们新的ID
进行重组。然后是summarise
AMOUNT
。
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。