gpt4 book ai didi

r - 获取向量之间匹配位置的有效方法

转载 作者:行者123 更新时间:2023-12-04 09:34:07 25 4
gpt4 key购买 nike

我需要效率来查找两个向量之间的索引(而不是逻辑向量)。我可以这样做:

which(c("a", "q", "f", "c", "z") %in% letters[1:10])

同理最好用 which.max求最大数的位置:
which(c(1:8, 10, 9) %in% max(c(1:8, 10, 9)))
which.max(c(1:8, 10, 9))

我想知道我是否有最有效的方法来找到 2 个向量中匹配项的位置。

编辑:
根据下面的问题/评论。我正在对向量列表进行操作。该问题涉及对已分解为一组单词的句子进行操作,如下所示。该列表可能包含 10000-20000 个或更多字符向量。然后根据该索引,我将抓取索引之前的 4 个单词和索引之后的 4 个单词并计算分数。
x <- list(c('I', 'like', 'chocolate', 'cake'), c('chocolate', 'cake', 'is', 'good'))
y <- rep(x, 5000)

lapply(y, function(x) {
which(x %in% c("chocolate", "good"))
})

最佳答案

这是使用 data.table 的相对更快的方法:

require(data.table)
vv <- vapply(y, length, 0L)
DT <- data.table(y = unlist(y), id = rep(seq_along(y), vv), pos = sequence(vv))
setkey(DT, y)
# OLD CODE which will not take care of no-match entries (commented)
# DT[J(c("chocolate", "good")), list(list(pos)), by=id]$V1

setkey(DT[J(c("chocolate", "good"))], id)[J(seq_along(vv)), list(list(pos))]$V1

想法:

首先,我们将您的列表取消列在 DT 列中命名 y .此外,我们创建了另外两个名为 id 的列。和 pos . id告诉列表中的索引和 pos告诉 id 内的位置.然后,通过在 id 上创建一个键列,我们可以进行快速子集化。有了这个子集,我们将得到相应的 pos每个 id 的值.在我们收集所有之前 pos每个 id在列表中,然后只输出列表列 (V1),我们通过将 key 设置为 id 来处理那些与我们的查询不匹配的条目。在对 id 的所有可能值进行第一次子集化和子集化之后(因为对于不存在的条目,这将导致 NA

使用 lapply 进行基准测试你帖子上的代码:
x <- list(c('I', 'like', 'chocolate', 'cake'), c('chocolate', 'cake', 'is', 'good'))
y <- rep(x, 5000)

require(data.table)
arun <- function() {
vv <- vapply(y, length, 0L)
DT <- data.table(y = unlist(y), id = rep(seq_along(y), vv), pos = sequence(vv))
setkey(DT, y)
setkey(DT[J(c("chocolate", "good"))], id)[J(seq_along(vv)), list(list(pos))]$V1
}

tyler <- function() {
lapply(y, function(x) {
which(x %in% c("chocolate", "good"))
})
}

require(microbenchmark)
microbenchmark(a1 <- arun(), a2 <- tyler(), times=50)

Unit: milliseconds
expr min lq median uq max neval
a1 <- arun() 30.71514 31.92836 33.19569 39.31539 88.56282 50
a2 <- tyler() 626.67841 669.71151 726.78236 785.86444 955.55803 50

> identical(a1, a2)
# [1] TRUE

关于r - 获取向量之间匹配位置的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18172378/

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