由多个范围子集 [英] Subset by multiple ranges
本文介绍了由多个范围子集的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我想获取一个介于多个范围之间的值的列表。
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屋!
查看全文