gpt4 book ai didi

R,如何矢量化此操作

转载 作者:行者123 更新时间:2023-12-05 00:20:33 25 4
gpt4 key购买 nike

在 R 中,我怎样才能最好地矢量化这个操作?

我有一个引用值表,有一个下限 (A) 和上限 (B)。

我还有一个值表 (X) 来查找上表。

对于 X 的每个值,我需要确定它是否位于引用表中 A 和 B 的任何值之间。

为了演示上述内容,这里是一个使用循环的解决方案:

#For Reproduceability,
set.seed(1);

#Set up the Reference and Lookup Tables
nref = 5; nlook = 10
referenceTable <- data.frame(A=runif(nref,min=0.25,max=0.5),
B=runif(nref,min=0.50,max=0.75));
lookupTable <- data.frame(X=runif(nlook),IsIn=0)

#Process for each row in the lookup table
#search for at least one match in the reference table where A <= X < B
for(x in 1:nrow(lookupTable)){
v <- lookupTable$X[x]
tmp <- subset(referenceTable,v >= A & v < B)
lookupTable[x,'IsIn'] = as.integer(nrow(tmp) > 0)
}

我正在尝试删除 for(x in .... )组件,因为我现实生活中的表格有成千上万条记录。

最佳答案

我找不到确切的骗子,所以这里有一个可能的解决方案,使用 data.table::foverlaps .首先,我们需要向 lookupTable 添加一个附加列以便在双方建立界限。然后key referenceTable (foverlaps 工作所必需的)然后只运行一个简单的重叠连接,同时只选择第一个连接,因为您想要任何连接(我使用了 0^ 以便转换为二进制,因为您不想要实际的地点)

library(data.table)
setDT(lookupTable)[, Y := X] # Add an additional boundary column
setkey(setDT(referenceTable)) # Key the referenceTable data set
lookupTable[, IsIn := 0 ^ !foverlaps(lookupTable,
referenceTable,
by.x = c("X", "Y"),
mult = "first",
nomatch = 0L,
which = TRUE)]
# X IsIn Y
# 1: 0.2059746 0 0.2059746
# 2: 0.1765568 0 0.1765568
# 3: 0.6870228 1 0.6870228
# 4: 0.3841037 1 0.3841037
# 5: 0.7698414 0 0.7698414
# 6: 0.4976992 1 0.4976992
# 7: 0.7176185 1 0.7176185
# 8: 0.9919061 0 0.9919061
# 9: 0.3800352 1 0.3800352
# 10: 0.7774452 0 0.7774452

关于R,如何矢量化此操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34152573/

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