匹配从一个数据集到参考数据集(R)的行

时间:2016-04-20 10:14:36

标签: r

我有一个问题。 我们说我有两个数据帧。

values    <-   data.frame(x = rnorm(10000), y = rnorm(10000), matches = 0)
reference <-   data.frame(a = rnorm(10000), b = rnorm(10000))

对于“值”中的每一行,我想知道在定义范围内的“参考”数据集中有多少匹配。

system.time(

for (i in 1:nrow(values))
{  
# defining valid range    
x1 <- values$x[i] - 0.1 
x2 <- values$x[i] + 0.1
y1 <- values$y[i] - 0.2
y2 <- values$y[i] + 0.2

#matching values versus reference dataset
values$matches[i] <- nrow(reference[reference$a %between% c(x1,x2) & reference$b %between% c(y1,y2),])
}

)


user  system elapsed 
9.91    0.03    9.94 

上面的示例是有效的,但对于大型数据集,它需要很长时间。 也许这可以用data.table完成吗?

提前谢谢

2 个答案:

答案 0 :(得分:0)

这是一个data.table方法:

# set of data.tables
values    <-   setDT(data.frame(x = rnorm(10000), y = rnorm(10000), matches = 0))
reference <-   setDT(data.frame(a = rnorm(10000), b = rnorm(10000)))
# calculate sum of ranges, initialize matches variable as integer for speed
values[, matches := integer(nrow(values))]

values[, matches := sum(reference$a %between% c(x-0.1, x+0.1) * 
                        reference$b %between% c(y-0.2, y+0.2)), by=rownames(values)]

它可能比你的速度快,但可能有更快的方法。

答案 1 :(得分:0)

这是使用dplyr的rowwise()的另一种解决方案。 如果“定义范围”是对称的,则可以通过仅检查两个条件来提高性能:

count_matches <- function(x, y) {
    sum(abs(reference$a - x) <= 0.1 & abs(reference$b - y) <= 0.2)
}

library(dplyr)
values %>%
  rowwise() %>%
  mutate(matches = count_matches(x, y))