R:计算具有相似值的行
我有一个有两列的数据表。对于每一列,我想计算第1行具有相同值的行数,第2行的值为第2列值的+/-10。以下是一些数据和结果的示例: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循环来进行这种计算(
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
的示例代码,这将是一个很好的答案。如果没有这些,这不是一个真正的答案,只是一个注释。