我有一个带有借记或贷记记录的数据框。贷方记录在借方处有完全匹配的记录。我需要从数据框中删除贷方和链接的借方记录。
问题是记录不是唯一的,所以我不想删除所有匹配的记录,只是一个。 (因此无法进行反连接)。行中的值是完全匹配的,并且它们具有相同的列。
我的方法是将数据框拆分为“借方”数据框(ddc)和“贷方”数据框(dcc)。现在循环遍历贷方数据帧的每一行,并在借方数据帧中找到匹配的行并将其删除。请注意,它们必须按几列进行匹配。
当我尝试使用匹配功能时,它会不断计算,并且我觉得它不起作用。 我现在尝试的是:
ddc <- ddc[!(ddc[match(dcc[1,],ddc),]),]
我的目标是:
for(i in 1:nrow(dcc)){
ddc <- ddc[!(ddc[match(dcc[i,],ddc),]),]
}
结果应为借方数据帧,其中贷方数据帧的每一行都将被删除。 因此,如果ddc有10行,而dcc有2行,则新的dc将有8行。
任何帮助将不胜感激!
示例数据:
dcc ddc new ddc
x1 x2 x3 x4 x5 x1 x2 x3 x4 x5 x1 x2 x3 x4 x5
1 2 3 5 6 1 2 2 3 5 1 2 2 3 5
1 3 2 3 5 1 2 3 3 3 1 2 3 3 3
1 2 3 5 6 1 2 2 3 5 1 2 2 3 5
1 5 6 7 3 1 5 5 2 3 1 5 5 2 3
1 3 2 3 5 1 3 2 3 5
1 2 3 5 6
1 3 2 3 5
1 5 6 7 3
答案 0 :(得分:0)
我将像上面的评论中提到的Jonny Phelps一样使用anti_join
,但是我首先要添加某种排名列以确保我保留重复项,这是我的建议:< / p>
# read the data
dcc <- read.table(text = 'x1 x2 x3 x4 x5
1 2 3 5 6
1 3 2 3 5
1 2 3 5 6
1 5 6 7 3 ', header = TRUE)
ddc <- read.table(text = 'x1 x2 x3 x4 x5
1 2 2 3 5
1 2 3 3 3
1 2 2 3 5
1 5 5 2 3
1 3 2 3 5
1 2 3 5 6
1 3 2 3 5
1 5 6 7 3', header = TRUE)
# Add the ranking column in ddc
ddc <- ddc %>%
group_by_all() %>%
mutate(rank_row = row_number()) %>%
ungroup()
# Add a dummy ranking column in dcc, which is always = 1
dcc <- dcc %>% mutate(rank_row = 1)
# and now the anti_join by = c("x1", "x2", "x3", "x4", "x5", "rank_row") or by = names(ddc)
anti_join(ddc, dcc, by = names(ddc))