gpt4 book ai didi

r - 有效计算 data.table 中的非 NA 元素

转载 作者:行者123 更新时间:2023-12-02 14:58:05 25 4
gpt4 key购买 nike

有时我需要计算 data.table 中的一列或另一列中非 NA 元素的数量。最好的 data.table 定制方法是什么?

为了具体起见,让我们这样做:

DT <- data.table(id = sample(100, size = 1e6, replace = TRUE),
var = sample(c(1, 0, NA), size = 1e6, replace = TRUE), key = "id")

我想到的第一件事是这样的:

DT[!is.na(var), N := .N, by = id]

但这有一个不幸的缺点,即 N 不会分配给缺少 var 的任何行,即 DT[is.na(var), N] = NA

所以我通过附加来解决这个问题:

DT[!is.na(var), N:= .N, by = id][ , N := max(N, na.rm = TRUE), by = id] #OPTION 1

但是,我不确定这是最好的方法;我想到的另一种选择和类似 this 所建议的一个选择data.frame 的问题是:

DT[ , N := length(var[!is.na(var)]), by = id] # OPTION 2

DT[ , N := sum(!is.na(var)), by = id] # OPTION 3

比较这些的计算时间(平均超过 100 次试验),最后一个似乎是最快的:

OPTION 1 | OPTION 2 | OPTION 3
.075 | .065 | .043

有人知道 data.table 的更快方法吗?

最佳答案

是的,第三个选项似乎是最好的。我添加了另一个选项,仅当您考虑将 data.table 的键从 id 更改为 var 时才有效,但选项 3 仍然是您的最快选项数据。

library(microbenchmark)
library(data.table)

dt<-data.table(id=(1:100)[sample(10,size=1e6,replace=T)],var=c(1,0,NA)[sample(3,size=1e6,replace=T)],key=c("var"))

dt1 <- copy(dt)
dt2 <- copy(dt)
dt3 <- copy(dt)
dt4 <- copy(dt)

microbenchmark(times=10L,
dt1[!is.na(var),.N,by=id][,max(N,na.rm=T),by=id],
dt2[,length(var[!is.na(var)]),by=id],
dt3[,sum(!is.na(var)),by=id],
dt4[.(c(1,0)),.N,id,nomatch=0L])
# Unit: milliseconds
# expr min lq mean median uq max neval
# dt1[!is.na(var), .N, by = id][, max(N, na.rm = T), by = id] 95.14981 95.79291 105.18515 100.16742 112.02088 131.87403 10
# dt2[, length(var[!is.na(var)]), by = id] 83.17203 85.91365 88.54663 86.93693 89.56223 100.57788 10
# dt3[, sum(!is.na(var)), by = id] 45.99405 47.81774 50.65637 49.60966 51.77160 61.92701 10
# dt4[.(c(1, 0)), .N, id, nomatch = 0L] 78.50544 80.95087 89.09415 89.47084 96.22914 100.55434 10

关于r - 有效计算 data.table 中的非 NA 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29683752/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com