R:将值定义为范围/区间

R: define value as range / interval

我环顾四周,但找不到有帮助的答案。我正在尝试在 R 中设置一个键值 table,其中键被定义为范围或间隔,以便我可以进行查找以查找落在范围/间隔内的任何键的值. 举一个不起作用的最小例子。

data.frame(key = c(range(0, 1),
                   range(1, 2)),
           value = c("A", 
                     "B"))

数据框不会包含两行,而是四行,因为 R 将下限和上限区间视为两个单独的值,并循环使用值列以达到四行。除了这个问题,我也找不到可以定义下限和上限的范围/区间函数。

编辑: 所需的输出将是这样的 table:

key      value    
(0, 1)   "A"
(1, 2)   "B"

所以我可以对值 a 执行类似以下查询的操作: table$value[其中 %in% table$key]

它不是很优雅,但您可以这样做以使其实用且方便:

df = data.frame(values=letters[1:2])
df$keys=list(0:1, 1:2)
#  values keys
#1      a 0, 1
#2      b 1, 2

这样您就不需要像使用 df$keys 访问数据时那样需要 regex

如果我没理解错的话,你想找到每个值出现的区间。如果是这种情况,那么您可以通过找到每个 "value" 数字的最小和最大 "key" 数字来实现。

这可以使用 dplyr 包轻松实现,如下所示:

#If not installed do install.packages("dplyr")
library(dplyr)

#Provided example
df = data.frame(key = c(range(0, 1),range(1, 2)),
                value = c("A", "B"))

#First group data by "value" variable
# and then paste a vector with min and max of "key" variable
df2 = df %>% 
      group_by(value) %>% 
      summarise(key = paste0("(", min(key), ",", max(key), ")"))

结果:

  value   key
1     A (0,1)
2     B (1,2)

您可以通过以下操作轻松获取区间内的值:

subset(df2, key == "(0,1)")$value

这个解决方案是通用的(不管你有多少个值)。此外,如果您对此感兴趣,您可以轻松地 return 最小和最大列,而不是格式 (min,max)

df3 = df %>% 
      group_by(value) %>% 
      summarise(min = min(key), 
                max = max(key))

结果:

  value min max
1     A   0   1
2     B   1   2

您可以通过以下方式获得所需的时间间隔:

subset(df3, min >= 0 & max <= 1)$value