繁体   English   中英

在R中找到最接近的行

[英]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算法。 像这样做呢?

  • 添加索引/ ID列df$ID <- seq.int(nrow(df))O(N)
  • 使用稳定排序( O(N log(N)) )按Var1df进行排序
  • 一列线性越过造成差,建立逻辑向量( O(N)
  • 从ID列( O(N) )获取索引

对于Var2相同

那你就可以做结果的交集

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM