【发布时间】:2014-10-21 00:54:33
【问题描述】:
我有一个问题似乎与之前关于 SO 的一些问题有点相似,但又完全不同,以至于我无法找到一个优雅的解决方案。
我有一组需要与理论值数据库匹配的真实数据。我想根据多组多个条件进行过滤。例如,如果我有以下理论值的data.frame,
df <- data.frame(x=c(10,13,16,22,28,30), y=c(1:6))
> df
x y
1 10 1
2 13 2
3 16 3
4 22 4
5 28 5
6 30 6
我有以下真实数据,
realdata <- data.frame(x=c(10.05, 13.06, 22.01),y=c(1.02, 1.99, 3.96))
> realdata
x y
1 10.05 1.02
2 13.06 1.99
3 22.01 3.96
我可以通过以下方式轻松搜索哪些理论行与我的真实数据中的行对应:
tolerance <- .10
subset(df, x>(realdata[1,1]-tolerance) & x<(realdata[1,1]+tolerance) &
+ y>(realdata[1,2]-tolerance) & y<(realdata[1,2]+tolerance))
subset(df, x>(realdata[2,1]-tolerance) & x<(realdata[2,1]+tolerance) &
+ y>(realdata[2,2]-tolerance) & y<(realdata[2,2]+tolerance))
#...etc for each row of real data
但是有什么方法可以在不编写循环的情况下对我的真实数据中的所有行执行此操作?基本上,我想在给定的容差内找到与我的真实数据中的任何一行相对应的所有理论行。实际上,我的理论表和实际表有数十万个观察值,这是我经常做的事情,所以我认为速度很重要。
另外,如果有人知道一种方法来确定一个值是否在一个范围内,使用在 subset() 中工作的单个表达式,那将是锦上添花。不过,也许子集是错误的函数,在这种情况下没关系。
【问题讨论】:
-
旁白:一般来说,您希望远离
subset而使用[,尤其是在您正在编程时