使用一些类似的信息来标识行并对其进行子集

时间:2019-08-15 19:53:16

标签: r

我正在处理一个包含金融交易报告的数据集。每一行对应一个报告。但是,如果报告中有错误,则会生成第二个“错误报告”以取消包含错误的报告。

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)

但是,这还不够精确,当我将此代码应用于(非常)大型数据集时,它会识别出太多的“错误”,而不是与“错误报告”数量完全相同。

如何准确识别“错误”?

希望这是可以理解的。

3 个答案:

答案 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列是相关的,但如果不相关,则可以按更多标识符分组。

相关问题