gpt4 book ai didi

r - 不使用 data.frame 的数值透明查找表?

转载 作者:行者123 更新时间:2023-12-04 15:29:14 25 4
gpt4 key购买 nike

Advanced R dicusses the idea of using character subsetting for lookup tables.

x <- c("m", "f", "u", "f", "f", "m", "m")
lookup <- c(m = "Male", f = "Female", u = NA)
lookup[x]
#> m f u f f m m
#> "Male" "Female" NA "Female" "Female" "Male" "Male"

创建于 2019-03-04 由 reprex package (v0.2.1)

但是,这个想法不适用于数字查找,因为 names是需要成为字符向量的特殊属性。

什么是数字查找的简单等效解决方案,不需要 data.frame ?

我想避免 data.frame解决方案,因为键和值之间的映射仅基于顺序而不是更透明的 3 = 'Excellent', 2 = 'Good', 1 = 'Poor' .

使用 data.frame 的解决方案由字符查找表后面的段落建议。

grades <- c(1, 2, 2, 3, 1)

info <- data.frame(
grade = 3:1,
desc = c("Excellent", "Good", "Poor"),
fail = c(F, F, T)
)

info[grades, 'desc']
#> [1] Excellent Good Good Poor Excellent
#> Levels: Excellent Good Poor

创建于 2019-03-04 由 reprex package (v0.2.1)

最佳答案

如果您的键只是正整数,您可以使用 Soren 在他们对这个问题的回答中建议的索引值:https://stackoverflow.com/a/54990917

如果没有,您仍然可以使用 names通过将您的数字存储在 names(lookup) 中,您上面描述的基于策略作为字符,然后使用 as.character将数字键向量转换为正确的匹配形式:

y <- c(1, -2, 1.3, -5)
lookup_num <- c('1' = 'Cat', '-2' = 'Dog', '1.3' = 'Fish', '-5' = 'Hedgehog')
lookup_num[as.character(y)]
1 -2 1.3 -5
"Cat" "Dog" "Fish" "Hedgehog"

这种方法的一个可能的缺点是,由于数字将作为字符串处理,它不会将 0.0 与 0 或 3.00 与 3 正确匹配,因此您需要确保您的数值是干净的。

如果性能不是一个大问题,您可以颠倒键和值的顺序,将您的数字键作为值,将字符查找值作为名称,然后使用 sapply查找每个键:
lookup_num <- c('Cat' = 1, 'Dog' = -2, 'Fish' = 1.3, 'Hedgehog' = -5)
keys <- c(-2, 1.3, -2, 1)
sapply(keys, function(x) which(lookup_num == x))
Dog Fish Dog Cat
2 3 2 1

这具有使用数字匹配的优点,可以抵抗由可变数字格式引起的问题,并为您的匹配方式提供很大的灵活性(例如,您可以执行以下操作: abs(lookup_num - x) < 0.1 在您的数字匹配中添加摆动空间)

缺点是时间复杂度非常差,但是如果您的键列表和/或查找表不是很大,您根本不会注意到。

关于r - 不使用 data.frame 的数值透明查找表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54990814/

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