找出满足两个条件时的行号
Find out row number when two conditions met
此问题与 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 包含 43,261,925 行,数据集 B 包含 500 行。
请看我的代码
A变量是数据集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 总是 return NULL。如果我在循环的基本非并行计算中编写它,它可以完美运行。但由于文件较大,需要很长时间...
有人可以对此代码发表评论吗?我也想知道是否有任何其他方法可以使用内置 R 函数或 dplyr 来清理此数据?
非常感谢!
将 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, ]
此问题与 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 包含 43,261,925 行,数据集 B 包含 500 行。
请看我的代码
A变量是数据集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 总是 return NULL。如果我在循环的基本非并行计算中编写它,它可以完美运行。但由于文件较大,需要很长时间...
有人可以对此代码发表评论吗?我也想知道是否有任何其他方法可以使用内置 R 函数或 dplyr 来清理此数据?
非常感谢!
将 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, ]