我有一个问题。 我们说我有两个数据帧。
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完成吗?
提前谢谢
答案 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))