gpt4 book ai didi

r - 在没有矢量扫描的情况下查找给定间隔中的值

转载 作者:行者123 更新时间:2023-12-01 11:44:25 25 4
gpt4 key购买 nike

使用 R 包 data.table 可以在不对数据进行全矢量扫描的情况下找到给定区间内的值。例如

>DT<-data.table(x=c(1,1,2,3,5,8,13,21,34,55,89))
>my.data.table.function(DT,min=3,max=10)
x
1: 3
2: 5
3: 8

DT 可以是一个非常大的表。

奖金问题:是否可以对一组非重叠间隔做同样的事情,例如

>I<-data.table(i=c(1,2),min=c(3,20),max=c(10,40))
>I
i min max
1: 1 3 10
2: 2 20 40
> my.data.table.function2(DT,I)
i x
1: 1 3
2: 1 5
3: 1 8
4: 2 21
5: 2 34

IDT 都可以很大。非常感谢

最佳答案

这是@user1935457 提出的代码的变体(参见@user1935457 帖子中的评论)

system.time({

if(!identical(key(DT), "x")) setkey(DT, x)
setkey(IT, min)

#below is the line that differs from @user1935457
#Using IT to address the lines of DT creates a smaller intermediate table
#We can also directly use .I
target.low<-DT[IT,list(i=i,min=.I),roll=-Inf, nomatch = 0][,list(min=min[1]),keyby=i]
setattr(IT, "sorted", "max")

# same here
target.high<-DT[IT,list(i=i,max=.I),roll=Inf, nomatch = 0][,list(max=last(max)),keyby=i]
target <- target.low[target.high, nomatch = 0]
target[, len := max - min + 1L]

rm(target.low, target.high)
ans.roll2 <- DT[data.table:::vecseq(target$min, target$len, NULL)][, i := unlist(mapply(rep, x = target$i, times = target$len, SIMPLIFY=FALSE))]
setcolorder(ans.roll2, c("i", "x"))
})
# user system elapsed
# 0.07 0.00 0.06


system.time({
# @user1935457 code
})
# user system elapsed
# 0.08 0.00 0.08

identical(ans.roll2, ans.roll)
#[1] TRUE

这里的性能增益不是很大,但是对于较大的 DT 和较小的 IT 应该更敏感。再次感谢@user1935457 的回答。

关于r - 在没有矢量扫描的情况下查找给定间隔中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16666183/

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