gpt4 book ai didi

r - 以双射方式将向量映射为整数

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

我有 100,000 个 5 长度的向量(下面的列表 VECTORS),它们的元素是从一百万个值中选择的。

# dictionary
dictionary=seq(1:1e6)

# generate 100,000 5-length vectors whose elements are chosen from dictionary
VECTORS <- lapply(c(1:1e5), sample, x = dictionary, size =5)

我的问题是将每个完全相同的向量映射到一个整数,即我需要一个 mappy 函数来输入一个向量并产生一个整数。 mappy(c(58431, 976854, 661294, 460685, 341123))=15 , 例如。你知道如何以有效的方式做到这一点吗?

附属问题:如果我的向量不再相同长度怎么办?

最佳答案

我在这里假设您想要列表中的向量和整数之间的双射。一种方法是从向量的字符表示中创建一个因子变量。让我们从代码的可重现版本开始(我将使它成为一个较小的向量):

set.seed(144)
VECTORS <- replicate(1e2, sample(seq_len(1e6), 5), FALSE)

现在您可以从每个向量的字符表示中创建一个因子变量:
fvar <- factor(sapply(VECTORS, paste, collapse=" "))

现在我们有了 VECTORS 元素的字符串表示之间的双射和整数:
vec <- c(894025, 153892, 98596, 218401, 36616)  # 15th element of VECTORS
which(levels(fvar) == paste(vec, collapse=" "))
# [1] 90
levels(fvar)[90]
# [1] "894025 153892 98596 218401 36616"
as.numeric(strsplit(levels(fvar)[90], " ")[[1]])
# [1] 894025 153892 98596 218401 36616

如果你想把它们包装成漂亮的函数:
id.from.vec <- function(vec) which(levels(fvar) == paste(vec, collapse=" "))
id.from.vec(c(894025, 153892, 98596, 218401, 36616))
# [1] 90

vec.from.id <- function(id) as.numeric(strsplit(levels(fvar)[id], " ")[[1]])
vec.from.id(90)
# [1] 894025 153892 98596 218401 36616

请注意,即使向量的长度不同,这也是开箱即用的。

关于r - 以双射方式将向量映射为整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33065243/

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