R 用一些相似的信息标识行并将其子集
我正在处理一个包含金融交易报告的数据集。每行对应一个报表。但是,当报告出错时,会生成第二个“错误报告”,以取消包含错误的报告R 用一些相似的信息标识行并将其子集,r,R,我正在处理一个包含金融交易报告的数据集。每行对应一个报表。但是,当报告出错时,会生成第二个“错误报告”,以取消包含错误的报告 Case Study ID DATE NB ERRORS 1 06054B149 20160526 95131 - 2 06054B149 20160526 95132 - 3 06054B149 20160526 951
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)
ErrorReports基于“但是,当报告出现错误时,会生成第二个“错误报告”以取消包含错误的报告”似乎只有有错误的报告才会在数据中重复。这里有一个简单的方法来移除它们-
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, ]
与Shree的答案相似,但略短一些。如果您只对干净的数据框感兴趣,就可以:
Filtered <- CaseStudy %>% group_by(NB) %>% filter(n() == 1)
已按(NB)%>%筛选器筛选%group\u(n()=1)
这将过滤掉所有错误和所有错误报告。从您的示例数据中,我得到的印象是,只有列NB是相关的,但如果不是,您可以按更多标识符进行分组。考虑ave
根据相应的ID、日期和NB(ifelse
将列呈现为数字),用X
标记任何记录:
CaseStudy$检查您应该显示所需输出的示例。我认为dplyr包在这里可能很有用。您正在对所有列使用anti_join
。也许你需要anti_-join(案例研究,错误,by=c(“ID”,“DATE”,“NB”))
Nice!我想,一个带有+(ERRORS==“x”)
的略短版本应该可以工作。我已经修改了我的代码以考虑您的解决方案,但它已经运行了30分钟了。我想这是正常的,因为它更精确,但我似乎没有足够的处理能力来处理这个问题。你的数据一定很大,因为我错过了那张小纸条。奇怪的是,数据来自数据库吗?我不知道你说的“数据库”是什么意思。我从一个名为TRACE的数据库获取数据,但我使用的数据来自一个csv文件。我不知道这是否回答了你的问题!
Filtered <- CaseStudy %>% group_by(NB) %>% filter(n() == 1)
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