R:计算具有相似值的行

问题描述 投票:0回答:3

我有一个包含两列的数据表。对于每一列,我想计算第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
}

谢谢!

r performance processing-efficiency
3个回答
2
投票

使用dplyr

library(dplyr)
info %>% group_by(C1) %>% mutate(near = abs(diff(C2)) < 10)

这假设C1的每个值有2行。


0
投票

@Gregor提供的更一般的解决方案版本:

library(dplyr)
info %>% 
  group_by(C1) %>% 
  mutate(near = colSums(abs(outer(C2, C2, "-")) <= 10) - 1)

0
投票

我不知道我是否放弃了解你的问题,在我看来你可以用sqldf库实现良好的性能。这不是最聪明的方式。但它会运作良好。

如果你想看看这个页面https://www.google.com.br/amp/s/www.r-bloggers.com/make-r-speak-sql-with-sqldf/amp/

© www.soinside.com 2019 - 2024. All rights reserved.