我有一个包含两列的数据表。对于每一列,我想计算第1行具有相同值的行数和第2列的值,它是第2列的值的+/- 10。以下是一些数据和结果可能看起来的示例喜欢:
Table: info
C1 C2 near
a 5 0
a 25 1
a 27 1
b 8 1
b 12 2
b 20 1
c 10 0
我写了一个丑陋的for循环来进行这种计算(见下文),但我想知道是否有人有更高效的解决方案,可以在100k +行表上更好地工作。
for (f in 1:5) {
n <- info$C2[f]
info$near[f] <- nrow(subset(info, info$C1 == info$C1[f] & info$C2 >= n-10 & info$C2 <= n+10))-1
}
谢谢!
使用dplyr
:
library(dplyr)
info %>% group_by(C1) %>% mutate(near = abs(diff(C2)) < 10)
这假设C1
的每个值有2行。
@Gregor提供的更一般的解决方案版本:
library(dplyr)
info %>%
group_by(C1) %>%
mutate(near = colSums(abs(outer(C2, C2, "-")) <= 10) - 1)
我不知道我是否放弃了解你的问题,在我看来你可以用sqldf库实现良好的性能。这不是最聪明的方式。但它会运作良好。
如果你想看看这个页面https://www.google.com.br/amp/s/www.r-bloggers.com/make-r-speak-sql-with-sqldf/amp/