【问题标题】:Find out row number when two conditions met满足两个条件时找出行号
【发布时间】:2018-01-11 17:46:15
【问题描述】:

这个问题与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 总是返回 NULL。如果我用基本的非并行计算 for loop 编写它,它可以完美地工作。但是由于文件很大,需要很长时间...

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

非常感谢!

【问题讨论】:

  • 您的预期结果是什么?
  • 嗨,这是问题,我刚刚编辑过。
  • 在你的例子中,为什么 2017-1-1 被删除,而不是 2017-1-5?
  • 对不起,我刚刚编辑过。所以规则是只要 thr_market_cap > market_cap 和 date == date 满足,那么我想把这条记录挑出来。我能想到的就是遍历所有数据集并找到记录。有没有像 data.table 或 dplyr 这样的稍微复杂的查询包?

标签: r data-cleaning


【解决方案1】:

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

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

如果您想添加%&gt;% 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, ]

【讨论】:

  • 谢谢格雷戈尔。那么包会这样做吗?例如对于数据集 A 上的第一个条目,它将比较数据集 B 中的每个条目,如果条件满足则停止?谢谢
  • 啊这个方法太聪明了!!所以我相信它所做的是首先根据日期排序并将两个数据集连接在一起。因此,我可以将同一日期的数据集 B 的 Thr_Market_Cap 与数据集 A 的 Market_Cap 进行比较。非常感谢格雷戈尔!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-30
  • 1970-01-01
  • 2021-02-01
  • 2013-10-19
相关资源
最近更新 更多