[英]finding nearest rows with apply in R
我试图使此功能运行更快。 理想情况下,我将在数据帧上运行诸如apply之类的操作,并使其吐出结果的速度比现在快得多。 该函数的作用是获取一个看起来像这样的数据帧
df
Var1 Var2
5 0
9 0
4 1
6 1
2 2
4 2
然后它将遍历每一行,并检查数据帧中其他行(在Var1和Var2中)与您所在行中的Var1和Var2的值最接近的值。然后,输出为哪些行与其他行最接近。 例如
myFunc(df)
[[1]]
[1] 3 4
[[2]]
integer(0)
[[3]]
[1] 1 6
[[4]]
[1] 1
[[5]]
integer(0)
[[6]]
[1] 3
因此,第1行的值最接近第3行和第4行,而第2行附近没有其他行。 这是myFunc
myFunc = function(t) {
x=matrix(); x2=list()
y = matrix(); y2 = list()
for (i in 1:nrow(t)){
for (j in 1:nrow(t)){
#this will check for other rows <= 1 from the row I am currently in
if (abs(t[i,1] - t[j,1]) <= 1) {
x[j] = j
} else { x[j] = NA }
if (abs(t[i,2] - t[j,2]) <= 1) {
y[j] = j
} else { y[j] = NA }
}
x2[[i]] = x
y2[[i]] = y
}
for (i in 1:length(x2)){
x2[[i]] = x2[[i]][!x2[[i]] == i]
y2[[i]] = y2[[i]][!y2[[i]] == i]
}
x2 = lapply(x2, function(x) x[!is.na(x)])
y2 = lapply(y2, function(x) x[!is.na(x)])
#this intersects Var1 and Var2 to find factors that are close to both Var1 and Var2
z = list()
for (i in 1:length(x2)){
z[[i]] = intersect(unlist(x2[[i]]), unlist(y2[[i]]))
}
return(z)}
假设您仅使用两列,并且都使用整数,则可以使用具有欧式距离的dist
计算每个点之间的实际距离。 然后,您可以过滤那些大于2 ^ 0.5的距离。
如果您使用整数,它将起作用,因为如果var1或var2中的距离是2或更大,则您希望将其丢弃,但是在任何这些情况下,它总是>= 2
。
如果您不使用整数,则仍然可以使用dist
但要分别处理每一列,然后对其进行过滤。
我在想类似的东西:
d1 <- dist(df$Var1) # or d1 <- dist(Var1)
d2 <- dist(df$Var2) # or d2 <- dist(Var2)
现在您可以过滤哪些小于1
dF <- as.matrix(d1) <= 1 & as.matrix(d2) <= 1
diag(dF) <- NA
为了获得最终结果,您可以
colnames(dF) <- NULL
dF2 <- lapply(as.data.frame(dF), which)
names(dF2) <- 1:nrow(df)
# dF2
# $`1`
# [1] 3 4
# $`2`
# integer(0)
# $`3`
# [1] 1 6
# $`4`
# [1] 1
# $`5`
# integer(0)
# $`6`
# [1] 3
嗯...您有O(N 2 )算法。 像这样做呢?
df$ID <- seq.int(nrow(df))
( O(N) ) Var1
对df
进行排序 对于Var2
相同
那你就可以做结果的交集
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.