多个范围的子集 [英] Subset by multiple ranges

查看:17
本文介绍了多个范围的子集的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想获取一个介于多个范围之间的值的列表.

I want to get a list of values that fall in between multiple ranges.

library(data.table)
values <- data.table(value = c(1:100))
range <-  data.table(start = c(6, 29, 87), end = c(10, 35, 92)) 

我需要结果仅包含介于这些范围之间的值:

I need the results to include only the values that fall in between those ranges:

 results <- c(6, 7, 8, 9, 10, 29, 30, 31, 32, 33, 34, 35, 87, 88, 89, 90, 91, 92)

我目前正在使用 for 循环执行此操作,

I am currently doing this with a for loop,

results <- data.table(NULL)
for (i in 1:NROW(range){ 
          results <- rbind(results, 
              data.table(result = values[value >= range[i, start] & 
                 value <= range[i, end], value]))}

但是实际数据集非常大,我正在寻找更有效的方法.

however the actual dataset is quite large and I am looking for a more efficient way.

欢迎提出任何建议!谢谢!

Any suggestions are appreciated! Thank you!

推荐答案

利用data.table的非等连接可能性:

Using the non-equi join possibility of data.table:

values[range, on = .(value >= start, value <= end), .(results = x.value)]

给出:

    results
 1:       6
 2:       7
 3:       8
 4:       9
 5:      10
 6:      29
 7:      30
 8:      31
 9:      32
10:      33
11:      34
12:      35
13:      87
14:      88
15:      89
16:      90
17:      91
18:      92

<小时>

或者按照@Henrik 的建议:values[value %inrange% range].这也适用于具有多列的 data.table:


Or as per the suggestion of @Henrik: values[value %inrange% range]. This works also very well on data.table's with multiple columns:

# create new data
set.seed(26042017)
values2 <- data.table(value = c(1:100), let = sample(letters, 100, TRUE), num = sample(100))

> values2[value %inrange% range]
    value let num
 1:     6   v  70
 2:     7   f  77
 3:     8   u  21
 4:     9   x  66
 5:    10   g  58
 6:    29   f   7
 7:    30   w  48
 8:    31   c  50
 9:    32   e   5
10:    33   c   8
11:    34   y  19
12:    35   s  97
13:    87   j  80
14:    88   o   4
15:    89   h  65
16:    90   c  94
17:    91   k  22
18:    92   g  46

这篇关于多个范围的子集的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆