Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/68.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_Data Cleaning - Fatal编程技术网

R 当两个条件满足时,找出行号

R 当两个条件满足时,找出行号,r,data-cleaning,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。标准是当日期相同且数据集B中的阈值市值大于数据集A中的市值时

这个问题与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。标准是当日期相同且数据集B中的阈值市值大于数据集A中的市值时。然后我想在满足这两个标准时删除该条目的数据集A行

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

Data      Market_Cap
2017-1-2  30
2017-1-5  200
2017-1-1  50
我的数据集A包含43261925行,数据集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)
我试着用parfor编写这段代码,但它不起作用,DEL总是返回NULL。如果我在基本的非并行计算for loop中编写它,它将完美地工作。但由于文件太大,需要花费很长时间

有人能评论一下这段代码吗?我也想知道是否有其他方法可以使用内置的R函数或dplyr来清理这些数据


非常感谢

将B连接到A,然后过滤。使用
dplyr

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

你的预期结果是什么?嗨,这是在问题中,我刚刚编辑。在你的例子中,为什么2017-1-1被删除,而不是2017-1-5?对不起,我的不好。。。我刚刚编辑过。所以规则是只要满足了thr_market_cap>market_cap和date==date,那么我想把这个记录挑出来。我所能想到的就是遍历所有数据集并找到记录。有没有像data.table或dplyr这样的包可以执行这样稍微复杂的查询?谢谢Gregor。那么这个包裹可以做到这一点吗?e、 g.对于数据集A上的第一个条目,它将比较数据集B中的每个条目,并在满足条件时停止?谢谢!这个方法太聪明了!!所以我相信它所做的是根据日期进行第一次排序,并将两个数据集连接在一起。因此,我可以将数据集B在同一日期的Thr_市值与数据集A的市值进行比较。非常感谢格雷戈!!
left_join(A, B, by = "Date") %>% filter(Thr_Market_Cap <= Market_Cap)
library(data.table)
setDT(A, key = "Date")
setDT(B, key = "Date")

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