【问题标题】:R: define value as range / intervalR:将值定义为范围/间隔
【发布时间】:2015-08-07 07:31:05
【问题描述】:

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

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

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

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

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

所以我可以对值 a 执行以下查询: table$value[其中一个 %in% table$key]

【问题讨论】:

  • 期望的输出是什么?
  • 这不是findInterval这个函数能做的吗?
  • 是的 findInterval 可以告诉我一个值是否在我的范围内,但是如何在数据框中定义一列来保存范围内的值?
  • 你打算如何使用这些值?这看起来不错但毫无用处,除非您将使用正则表达式来提取它们。只创建两列不是更好吗?
  • IMO 您应该创建两列,一列用于范围的下限,另一列用于范围的上限...

标签: r range intervals bounds


【解决方案1】:

如果我理解正确,您想找到每个值出现的间隔。如果是这种情况,那么您可以通过查找每个“值”数字的最小和最大“键”数字来做到这一点。

这可以使用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

这个解决方案是通用的(不管你有多少值)。此外,如果您对此感兴趣,您可以轻松地返回最小和最大列,而不是格式 (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

【讨论】:

  • 非常感谢这个例子!由于时间不多了,周一将不得不详细研究它。会让你知道这是否比@Colonel Beauvel 解决方案更好。
【解决方案2】:

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

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

【讨论】:

  • 这可能会有所帮助。我现在正在努力如何有效地从输入值列中取回值,例如一个
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多