如何检查映射表中的值范围?

问题描述:

输入:如何检查映射表中的值范围?

library(dplyr) 
A <- data_frame(Type=c("A","A","B"),R=c(3, 7, 12), Value = c(120, 130,300)) 
A 
    Type  R Value 
    (chr) (dbl) (dbl) 
1  A  3 120 
2  A  7 130 
3  B 12 300 

映射数据集:

Mapping <- data_frame(Type=c("A","A","A","B","B","B"), Rmin =  c(1,6,11,1,6,11), Rmax = c(5,10,15,5,10,15), Threshold = c(50,100,200,50,200,300)) 
Mapping 

    Type Rmin Rmax Threshold 
    (chr) (dbl) (dbl)  (dbl) 
1  A  1  5  50 
2  A  6 10  100 
3  A 11 15  200 
4  B  1  5  50 
5  B  6 10  200 
6  B 11 15  300 

输出有望获得与随后的步骤。

  1. 在A和Mapping之间具有相同的Type值,找到R> = Rmin且R < = Rmax的条目的阈值。例如,对于A中的第1行表格,关系应该是50(1 < = 3 < = 5,并且类型A)。
  2. isAbove值通过分配isAbove <- 120>=50

作为结果而获得,预期的输出是:

B <- data_frame(Type=c("A","A","B"),R=c(3, 7, 12), Value = c(60, 90,250), isAbove = c(T,F,F)) 
B 

    Type  R Value isAbove 
    (chr) (dbl) (dbl) (lgl) 
1  A  3 120 TRUE 
2  A  7 130 TRUE 
3  B 12 300 FALSE 
+0

两个澄清的问题:(1)如何'Value'需要改变吗?它似乎没有逻辑背后。 (2)对于'B'中的第二行,'isAbove'应该是'TRUE',因为'Mapping'(这是行2)中的匹配行'130'高于'100'。不是吗? – Jaap

+0

@jaap,谢谢指出。 (1)“价值”栏中存在拼写错误。 B中的“值”列应该从A复制而来。(2)你没事。更新了问题。 – HappyCoding

使用非等距加入的data.table能力是非常适合于这一点。使用:

library(data.table) 

setDT(A) 
setDT(Mapping) 

A[Mapping, on = .(Type, R > Rmin, R < Rmax), isAbove := Value > Threshold] 

为您提供:

> A 
    Type R Value isAbove 
1: A 3 120 TRUE 
2: A 7 130 TRUE 
3: B 12 300 FALSE