Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R:计算具有相似值的行_R_Performance_Processing Efficiency - Fatal编程技术网

R:计算具有相似值的行

R:计算具有相似值的行,r,performance,processing-efficiency,R,Performance,Processing Efficiency,我有一个有两列的数据表。对于每一列,我想计算第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循环来进行这种计算(

我有一个有两列的数据表。对于每一列,我想计算第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
}
for(1:5中的f){

n带有
dplyr

library(dplyr)
info %>% group_by(C1) %>% mutate(near = abs(diff(C2)) < 10)
库(dplyr)
信息%>%group_由(C1)%%>%突变(近=abs(差(C2))<10)

这假设
C1
的每个值都有两行。

带有
dplyr

library(dplyr)
info %>% group_by(C1) %>% mutate(near = abs(diff(C2)) < 10)
库(dplyr)
信息%>%group_由(C1)%%>%突变(近=abs(差(C2))<10)

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

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

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

变异(near=colSums(abs(outer(C2,C2,“-”))@Gregor提供的解决方案的更一般版本:

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

mutate(near=colSums(abs(outer(C2,C2,“-”))我不知道是否退出了解您的问题,在我看来,您可以使用sqldf库获得良好的性能。这不是最明智的方法。但它会很好地工作


如果您想查看此页面

我不知道是否退出了解您的问题,在我看来,您可以使用sqldf库获得良好的性能。这不是最明智的方法。但它会很好地工作


如果你想看这一页

你能详细说明你的问题吗?我正在寻找一种比for循环更有效的方法来计算“near”列(它适用于小样本,但不适用于大样本)你能用一个更一般的例子来更新吗?我不确定一个更一般的例子会是什么样子,尽管我已经在示例表中添加了几行。我认为理解这个问题的最简单方法是查看有效的for循环,并思考如何更有效地完成相同的问题。你能详细说明你的方法吗问题我正在寻找一种比for循环更有效的方法来计算“near”列(它适用于小样本,但不适用于大样本)你能用一个更一般的例子来更新吗?我不确定一个更一般的例子会是什么样子,尽管我已经在示例表中添加了几行。我认为理解这个问题的最简单方法是查看有效的for循环,并思考如何更有效地完成相同的问题,以及如果C1 dif的值为如果行数不同,那么我不能100%确定您想要什么,但是
near=sum(abs(diff(C2))<10)
可能就是它(其他代码相同)。如果C1的值在行数上不同,那么我不能100%确定您想要什么,但是
near=sum(abs(diff(C2))<10)
可能就是它(其他代码相同)如果您给出了如何使用
sqldf
的示例代码,这将是一个很好的答案。如果您没有给出如何使用
sqldf
的示例代码,这将不是一个真正的答案,只是一个注释。如果您给出了如何使用
sqldf
的示例代码,这将是一个很好的答案。如果没有这些,这不是一个真正的答案,只是一个注释。