r - 计算数据框的 2 个元素之间的距离
问题描述
我有一个看起来像这样的数据框:
library(dplyr)
size_df <- tibble(size_chr = c("XS", "S", "M", "L", "XL", "1XL", "2XL", "3XL", "4XL", "5XL", "6XL"),
size_min = c(0,36,39,42,45,48,52,56,60,64,66),
size_max = c(36,39,42,45,48,52,56,60,64,66,70))
对于任何小于 70 的给定数字,我想找到它之间的两个尺寸,以及它们之间的距离(标准化为 0 和 1 之间)
例如:
input <- 37.2
# S 0.6
# M 0.4
input <- 48
# XL 1
input <- 68
# 5XL 0.5
# 6XL 0.5
解决方案
这是一个完美的案例findInterval()
。我们将创建类别之间的中断向量,并使用它们来计算比例因子。
size_breaks <- c(size_df[["size_min"]], max(size_df[["size_max"]]))
size_breaks
# [1] 0 36 39 42 45 48 52 56 60 64 66 70
size_spans <- diff(size_breaks)
size_scales <- 1 / size_spans
size_scales
# [1] 0.02777778 0.33333333 0.33333333 0.33333333 0.33333333 0.25000000 0.25000000
# [8] 0.25000000 0.25000000 0.50000000 0.25000000
findInterval()
将为我们提供下限的索引。上限就是那个索引 + 1。
neighbor_distances <- function(x) {
lower <- findInterval(x, size_breaks)
neighbors <- c(lower, lower + 1)
distances <- abs(x - size_breaks[neighbors]) * size_scales[lower]
tibble(
size_chr = size_df[["size_chr"]][neighbors],
distance = distances
)
}
它适用于您的第一个示例。
neighbor_distances(37.2)
# # A tibble: 2 x 2
# size_chr distance
# <chr> <dbl>
# 1 S 0.4
# 2 M 0.600
第二个示例给出了两行而不是仅一行,但可以通过函数中的额外逻辑来处理。我把这个逻辑排除在外以保持简单。
neighbor_distances(48)
# # A tibble: 2 x 2
# size_chr distance
# <chr> <dbl>
# 1 1XL 0
# 2 2XL 1
它为您的第三个示例提供了不同的答案,但我不知道为什么您希望将数字与小于下限的大小类别进行比较。
neighbor_distances(68)
# # A tibble: 2 x 2
# size_chr distance
# <chr> <dbl>
# 1 6XL 0.5
# 2 NA 0.5
推荐阅读
- azure-pipelines - 如何锁定发布管道 Azure Devops Server
- c# - 将数据从视图传输到控制器
- sql - 来自 SQL 的 Spark(Databricks)非托管表不处理标头
- apache-spark - PySpark JDBC Teradata Connection
- php - 如何使用 withAvg 但如果软删除应该无效?拉拉维尔
- reactjs - 如何在 Recoil 中实现相互依赖的状态?
- laravel - 在 laravel 中取 groupBy 的所有成员的总和
- spring-boot - Spring 应用程序无法与返回短主机名的负载平衡数据库服务连接
- matlab - 如何让 Matlab 做惰性求值?
- postgresql - 随着时间的推移,在不同情况下使用不同情况下的键查询相同的 JSON_B 嵌套