【问题标题】:How to get rows of a dataframe that contain values between two other values?如何获取包含其他两个值之间的值的数据框行?
【发布时间】:2015-05-04 18:11:39
【问题描述】:

所以我想在 data.frame 的列中查找值,这些值在定义的值范围内:

  example
 [1] 6 2 4 3 5 1
 pos
 [1] 1 3 2

我现在想获取以下两个语句都为 TRUE 的示例值,因此我只得到介于 pos - 1pos +1 之间的值:

if(example < pos - 1)
if(example > pos + 1)

现在我的任务的真正价值在 data.frame 中。如何提取包含这些值的完整行并构建新的 pos data.frame.

该示例的预期输出为:

result
[1] 2 3 1

提前致谢!

【问题讨论】:

  • 您说example 只包含一列,那么为什么要使用example[, 4] 选择不存在的列?你为什么不为初学者提供一个可重复的例子?我有一种感觉,在尝试重现您的错误时,您会首先了解它的来源。
  • pos 只有 6 个值,所以它只是被回收。您不是在与pos 中的所有值进行比较,而是在example[, 4] 中的每个值与pos 中的一个(回收的)值进行比较。您是否尝试将 example[, 4] 中的 each 值与 pos 中的 each 值进行比较?
  • 我认为您正在寻找类似indx &lt;- sapply(example[, -4], function(x) any(x &lt; pos + 25) | any(x &gt; pos - 25)) 的东西。然后就做example[indx, -4]
  • 所提供示例的预期输出是什么?
  • 所以example[sapply(example, function(x) any(x &gt; pos - 1) &amp; any(x &lt; pos + 1))] 应该可以工作。 4 不满足第二个条件,所以不应该在那里

标签: r dataframe range


【解决方案1】:

设置最小和最大阈值,然后将每个元素与它们进行比较

maxind <- max(pos + 1)
minind <- min(pos - 1)

然后

example[sapply(example, function(x) x > minind & x < maxind)]
## [1] 2 3 1

或者,类似

example[example > minind & example < maxind]
## [1] 2 3 1

或者使用data.table

library(data.table)
example[between(example, minind, maxind, incbounds = FALSE)]
## [1] 2 3 1

【讨论】:

    【解决方案2】:

    所以@David Arenburg 建议的解决方案是这样的:

    indx <- sapply(example[, 4], function(x) any(x < pos + 1) & any(x > pos - 1)) 
    

    那就做吧

    example[indx,]
    

    这将在指定列中的 data.frame 中搜索定义范围内的值,并且只会为您提供所需的行!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-12
      • 2013-09-06
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多