如何检查映射表中的值范围?
问题描述:
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
输出有望获得与随后的步骤。
- 在A和Mapping之间具有相同的Type值,找到R> = Rmin且R < = Rmax的条目的阈值。例如,对于A中的第1行表格,关系应该是50(1 < = 3 < = 5,并且类型A)。
- 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
答
使用非等距加入的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
两个澄清的问题:(1)如何'Value'需要改变吗?它似乎没有逻辑背后。 (2)对于'B'中的第二行,'isAbove'应该是'TRUE',因为'Mapping'(这是行2)中的匹配行'130'高于'100'。不是吗? – Jaap
@jaap,谢谢指出。 (1)“价值”栏中存在拼写错误。 B中的“值”列应该从A复制而来。(2)你没事。更新了问题。 – HappyCoding