我正在处理一个包含金融交易报告的数据集。每一行对应一个报告。但是,如果报告中有错误,则会生成第二个“错误报告”以取消包含错误的报告。
Case Study
ID DATE NB ERRORS
1 06054B149 20160526 95131 -
2 06054B149 20160526 95132 -
3 06054B149 20160526 95133 -
4 06054B149 20160526 95134 -
5 06054B149 20160526 95135 -
6 06054B149 20160526 95136 -
7 06054B149 20160526 95134 X
我的目标是找到包含错误的报告(在此处为第4行)和取消错误的相应“错误报告”(第7行),并将其从数据集中删除。
“错误报告”标有X,因此易于识别。更复杂的是识别包含错误的相应报告(“错误”)。
“错误”与“错误报告”共享一些相似的数据。在此示例中,我给出了ID,DATE和NB,但是有11个特征可用于精确识别错误(总共40个错误)。
我要做的是以下事情:
ErrorReports <- CaseStudy[(CaseStudy$ERRORS == "X"),]
Mistakes <- subset(CaseStudy, (NB %in% ErrorReports$NB)
&(DATE %in% ErrorReports$DATE)
&(ID %in% ErrorReports$ID))
Filtered <- anti_join(CaseStudy,Mistakes)
但是,这还不够精确,当我将此代码应用于(非常)大型数据集时,它会识别出太多的“错误”,而不是与“错误报告”数量完全相同。
如何准确识别“错误”?
希望这是可以理解的。
答案 0 :(得分:1)
考虑ave
通过相应的 ID , DATE 和 NB 标记带有X
的任何记录( ifelse
将列呈现为数字):
CaseStudy$CHECK <- with(CaseStudy, ave(ifelse(ERRORS=='X', 1, 0), ID, DATE, NB, FUN=max))
Mistakes <- CaseStudy[CaseStudy$CHECK == 1,]
Mistakes
# ID DATE NB ERRORS CHECK
# 4 06054B149 20160526 95134 - 1
# 7 06054B149 20160526 95134 X 1
Filtered <- CaseStudy[CaseStudy$CHECK == 0,]
Filtered
# ID DATE NB ERRORS CHECK
# 1 06054B149 20160526 95131 - 0
# 2 06054B149 20160526 95132 - 0
# 3 06054B149 20160526 95133 - 0
# 5 06054B149 20160526 95135 - 0
# 6 06054B149 20160526 95136 - 0
答案 1 :(得分:0)
基于“但是,如果在报告上犯了错误,则会生成第二个“错误报告”以取消包含错误的报告” ,似乎只有报告错误的数据会重复。这是删除它们的更简单方法-
identifiers <- c("ID", "DATE", "NB") # you have 11 of these in actual data
# identify duplicates using only the identifiers and ignoring the ERRORS column
bad_report_ind <- duplicated(CaseStudy[, identifiers]) |
duplicated(CaseStudy[, identifiers], fromLast = TRUE)
clean_reports <- CaseStudy[!bad_report_ind, ]
关于使用anti_join
的方式,您可能只需要使用identifiers
即可加入。
Filtered <- dplyr::anti_join(CaseStudy, Mistakes, by = identifiers)
答案 2 :(得分:0)
类似于Shree的回答,但简短一些。如果您只对干净的数据框感兴趣,它将这样做:
Filtered <- CaseStudy %>% group_by(NB) %>% filter(n() == 1)
这应该过滤掉所有错误和所有错误报告。从样本数据中,我得到的印象是仅NB列是相关的,但如果不相关,则可以按更多标识符分组。