Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 用一些相似的信息标识行并将其子集_R - Fatal编程技术网

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