在满足两个条件时找出行号

时间:2018-01-11 17:46:16

标签: r data-cleaning

这个问题与R。

有关

我有两个数据集。假设数据集A包含以下内容: 数据集A:

Date      Market_Cap
2017-1-1  10
2017-1-2  30
2017-1-1  50
2017-1-5  100
2017-1-5  200

另一个B包含以下内容:

Date      Thr_Market_Cap
2017-1-1  30
2017-1-2  20
2017-1-5  110

然后我想比较数据集A和数据集B.标准是当Date相同且数据集B中的阈值市值大于数据集A中的市值时。然后我想删除数据集A的行满足这两个标准的那一条目。

在数据集A中查询后的结果是:

Data      Market_Cap
2017-1-2  30
2017-1-5  200
2017-1-1  50

我的数据集A包含43261,925行,数据集B包含500行。

请查看我的代码

变量是数据集A,B变量是数据集B.两者都是数据框。

A_row=dim(A)[1]

B_row=dim(B)[1]

cores <- parallel::detectCores()
cl<-makeSOCKcluster(cores) #change the  to your number of CPU cores
registerDoSNOW(cl)

pb <- txtProgressBar(min=1, max=A, style=3)
progress <- function(n) setTxtProgressBar(pb, n)
opts <- list(progress=progress)

DEL <- foreach (i = 1:A_row, .options.snow=opts, 
.combine='rbind') %dopar% {
    for (j in 1:B_row){
        if (A$Date[i] == B$Date[j]){
            if(isTRUE(A$Market_Cap[i] < B$Thr_Market_Cap[j])){
                return(i)
            }   
        }
    }
}
close(pb)

DEL变量然后包含满足这两个条件的所有行号的列表,然后我可以用它来删除数据集A中的行

Adj_A= A[,-c(DEL)]

我尝试使用parfor编写此代码,但它不起作用,DEL始终返回NULL。如果我在循环的基本非并行计算中编写它,它可以完美地工作。但由于文件较大,需要很长时间......

有人可以对此代码发表评论,我也想知道是否有其他方法使用内置R函数或dplyr来清理这些数据?

非常感谢!

1 个答案:

答案 0 :(得分:1)

将B加入A,然后过滤。使用dplyr

left_join(A, B, by = "Date") %>% filter(Thr_Market_Cap <= Market_Cap)

如果你想添加%>% select(-Thr_Market_Cap)来摆脱额外的列。

您的数据量非常大,如果您使用data.table,那么这可能会更快:

library(data.table)
setDT(A, key = "Date")
setDT(B, key = "Date")

A = B[A, on = "Date"][Thr_Market_Cap <= Market_Cap, ]