【问题标题】:Faster solutions to my coding, replacing loop with...?更快地解决我的编码问题,用...替换循环?
【发布时间】:2025-11-30 06:55:02
【问题描述】:

我有两个数据列表,我喜欢将一个变量与另一个变量匹配,并在一个区间内匹配一个。我通过一个循环做到了这一点,但这需要很长时间。我正在尝试学习 R 并熟悉 lapply 家族,并想知道我是否可以在这里以某种方式使用它?或者是否有其他解决方案。

我的解决方案:

x <- data.frame( A = c(1,2,3,4,5,6,2,3,4,5,5), B =     c(67,49,49,59,68,91,67,48,49,67,91))
y <- data.frame( A = c(2,6,3,4,5,6,2,5,4,7,5), B =    c(67,50,49,59,50,91,67,50,49,68,91))

ko <- data.frame(c())

for(i in 1:11){
  wi <- which(y[,1] == x[i,1] & y[,2] <= (x[i,2] +10) & y[,2] >=     (x[i,2] - 10))
  t <- y[wi,]
  ko <- rbind(ko, t)
}

ko 中返回所需的结果。

【问题讨论】:

  • rbind 调用可能是这里的最大热门。预先分配ko并逐行填写会更快。

标签: r


【解决方案1】:

我们可以合并然后对结果使用过滤器:

# merge
res <- merge(x, y, by = "A")
# then filter on interval
res <- res[ res$B.y <= res$B.x + 10 &
              res$B.y >= res$B.x - 10, c("A", "B.y")]
colnames(res)[2] <- "B"

# compare to ko result, sort then check
ko <- ko[ order(ko$A, ko$B), ]
res <- res[ order(res$A, res$B), ]
all(ko == res)
# [1] TRUE

【讨论】: