gpt4 book ai didi

r - 如何加快 data.table 中的逐行操作

转载 作者:行者123 更新时间:2023-12-04 02:52:28 25 4
gpt4 key购买 nike

我有一个 data.table,包含 xe5 行和大约 100 列。我正在寻找前 3 列索引,以便该值不是 NA0

m <- matrix(rep(NA_integer_, 1e6), ncol=10)
for(i in 1:nrow(m)){
set.seed(i);
m[i, sample(1:10, 5)] = 1L:5L
}
DT <- data.table(m);
DT
V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
1: NA 5 1 2 3 NA 4 NA NA NA
2: NA 1 NA NA 3 5 2 NA NA 4
3: NA 1 4 3 NA NA NA 2 5 NA
4: 2 4 3 NA 5 1 NA NA NA NA
5: 5 4 1 NA NA NA 2 3 NA NA
---
99996: NA NA 2 3 5 1 NA NA 4 NA
99997: 2 NA NA NA 1 NA NA 3 5 4
99998: 5 NA 4 2 NA 1 3 NA NA NA
99999: NA 5 NA 1 NA 4 NA 2 NA 3
100000: 5 NA NA NA 2 3 1 NA NA 4

f <- function(x){return(list(which(!is.na(x) & x!=0L)[1:3L]))}

#Here is what apply do
system.time(test <- apply(m, FUN=f, MAR=1))
utilisateur système écoulé
1.30 0.00 1.29

我发现它很慢,这可能不是 data.table 的任务,我正在寻找一种快速获得此答案的方法(欢迎使用任何方法)。

最佳答案

首先,您可以使用 0/0NaN 的事实,这也将为 is.na< 提供 TRUE/。这将减少条件为一个 !is.na。其次,您可以使用 whicharr.ind = TRUE 进行矢量化,这将提供 rowcol 索引.我们可以使用它按 row 拆分并获得前三个 col 值,如下所示:

system.time(tt <- data.table(which(!is.na(DT[, lapply(.SD, function(x) x/0)]), 
arr.ind=TRUE), key="row")[, col[1:3], by="row"])
user system elapsed
0.360 0.000 0.359

编辑:另一种方式:

DT <- DT[, lapply(.SD, function(x) !is.na(x/0))]
out <- data.table(matrix(numeric(3e5), ncol=3))
system.time({
for (i in as.integer(seq_along(DT))) {
for (j in 1:3) {
zeros <- .subset2(DT, i) & (out[[j]] == 0)
out[zeros, names(out)[j] := i]
DT[zeros, c(names(DT)[i]) := FALSE]
}
}
})

但不确定它是否是最快的。

关于r - 如何加快 data.table 中的逐行操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17408267/

25 4 0