仅删除抵消值

问题描述 投票:0回答:2

我有可能重复的数据;然而,由于它的组织方式和数据的大小,很难快速判断它是重复记录还是被颠倒了。我试图找到一种方法来删除任何已被撤销的记录并保留所有其他记录,包括可能的重复记录。相关数据如下:

 Date       ID         Amount
1/1/2023   1234        $100.00
1/1/2023   1234        $100.00
1/1/2023   1234        -$100.00
1/3/2023   2345        $150.00
1/5/2023   3456        $200.00
1/6/2023   4444        $300.00
1/6/2023   4444        $300.00
1/6/2023   4444        $300.00
1/6/2023   4444        -$300.00

在这种情况下,我将保留 ID 1234、ID 2345、ID 3456 的一条记录和 ID 4444 的两条记录(包括一条重复记录)。我正在用头撞墙。我已经尝试了下面代码的各种迭代,但滞后/超前选项似乎对我不起作用。

library(dplyr)

df%>%
    group_by(Date, ID) %>%
    mutate(diff = VALUE + lag(VALUE),
           diff2 = VALUE + lead(VALUE)) %>%
    mutate_at(vars(diff:diff2), funs(coalesce(., 1))) %>%
    filter((diff !=0 & diff2 !=0))  %>%
    select(-diff, -diff2)
r dataframe dplyr subset
2个回答
1
投票

假设反转必须是连续的(在特定组内,由

Date
ID
定义),我认为这是可行的:

df %>%
  mutate(amt = sub("^-", "", Amount)) %>%
  group_by(Date, ID, amt) %>%
  mutate(
    reversed = grepl("^-", Amount) & !grepl("^-", lag(Amount)), 
    reversed = reversed | lead(reversed, default = FALSE)
  ) %>%
  filter(!reversed) %>%
  ungroup()
# # A tibble: 5 × 5TRUE
#   Date        ID Amount  amt     reversedTRUE
#   <chr>    <int> <chr>   <chr>   <lgl>   TRUE
# 1 1/1/2023  1234 $100.00 $100.00 FALSE   TRUE
# 2 1/3/2023  2345 $150.00 $150.00 FALSE   TRUE
# 3 1/5/2023  3456 $200.00 $200.00 FALSE   TRUE
# 4 1/6/2023  4444 $300.00 $300.00 FALSE   TRUE
# 5 1/6/2023  4444 $300.00 $300.00 FALSE   TRUE

0
投票
library(dplyr) # Version 1.1.1

df %>% 
  mutate(value = as.numeric(gsub('[$,]', '', Amount))) %>% 
  filter(value != -lag(value, default = 0), value != -lead(value, default = 0), 
         .by = c(Date, ID))
#>       Date   ID  Amount value
#> 1 1/1/2023 1234 $100.00   100
#> 2 1/3/2023 2345 $150.00   150
#> 3 1/5/2023 3456 $200.00   200
#> 4 1/6/2023 4444 $300.00   300
#> 5 1/6/2023 4444 $300.00   300

资料:

read.table(text = "Date       ID          Amount
                   1/1/2023   1234        $100.00
                   1/1/2023   1234        $100.00
                   1/1/2023   1234        -$100.00
                   1/3/2023   2345        $150.00
                   1/5/2023   3456        $200.00
                   1/6/2023   4444        $300.00
                   1/6/2023   4444        $300.00
                   1/6/2023   4444        $300.00
                   1/6/2023   4444        -$300.00", 
            header = T) -> df
© www.soinside.com 2019 - 2024. All rights reserved.