R 当两个条件满足时,找出行号
这个问题与R有关 我有两个数据集。假设数据集A包含以下内容: 数据集A: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中的市值时
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, ]