我有可能重复的数据;然而,由于它的组织方式和数据的大小,很难快速判断它是重复记录还是被颠倒了。我试图找到一种方法来删除任何已被撤销的记录并保留所有其他记录,包括可能的重复记录。相关数据如下:
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)
假设反转必须是连续的(在特定组内,由
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
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