我有两个大数据框,分别称为
一个交叉口位于几条街道的交叉处,
我想做的是:对于每个交点(x,y),获得具有相同street_label在users中最近邻居的ID和距离。
我使用spatstat函数nncross进行最近邻搜索,并使用plyr函数adply处理数据的解决方案。
我的解决方案如下: 1)编写一个用户定义的函数,以获取查询表中行的ID和最近邻居的距离。
以下是该示例的结果:
intersections
(表示街道系统的交叉口)和users
(表示网络用户),如下所示:
intersections
有三列:x
、y
和label_street
。它们分别表示在一个方形观察窗口(比如[0,5] x [0,5])中交叉口的位置以及它所在的街道。这是一个例子:
intersections <- data.frame(x=c(0.147674, 0.235356, 0.095337, 0.147674), y=c(0.132956, 0.150813, 0.087345, 0.132956), label_street = c(5,6,5,6))
head(intersections)
x y label_street
1 0.147674 0.132956 5
2 0.235356 0.150813 6
3 0.095337 0.087345 5
4 0.147674 0.132956 6
一个交叉口位于几条街道的交叉处,
intersections
表中的每个(x,y)
组合至少出现两次,但是使用不同的label_street
(例如前面示例中的第1行和第4行)。label_street
可能不是行号(这就是为什么它在我的示例中从5开始)。
users
有4列:x
、y
、label_street
和ID
。它们分别表示用户的位置、他所在的街道和每个用户的唯一ID
。在这个数据框中没有重复项,因为一个用户在唯一的街道上,且具有唯一的ID
。这里是一个例子(ID
和label_street
可能不是行号):
users <- data.frame(x = c(0.20428152, 0.17840619, 0.12964668, 0.20423856, 0.19349761, 0.10861251), y = c(0.14448448, 0.13921481, 0.11724543, 0.14447573, 0.14228827, 0.09891443), label_street = c(6,6,5,6,6,5), ID = c(2703, 3460, 4325, 12506, 19753, 21282))
head(users)
x y label_street ID
1 0.20428152 0.14448448 6 2703
2 0.17840619 0.13921481 6 3460
3 0.12964668 0.11724543 5 4325
4 0.20423856 0.14447573 6 12506
5 0.19349761 0.14228827 6 19753
6 0.10861251 0.09891443 5 21282
我想做的是:对于每个交点(x,y),获得具有相同street_label在users中最近邻居的ID和距离。
我使用spatstat函数nncross进行最近邻搜索,并使用plyr函数adply处理数据的解决方案。
我的解决方案如下: 1)编写一个用户定义的函数,以获取查询表中行的ID和最近邻居的距离。
NN <- function(row,query){
df <- row
window <- c(0,5,0,5) #Need this to convert to ppp objects and compute NN distance using nncross
NN <- nncross(as.ppp(row[,1:2],window),as.ppp(query[,1:2],window))
df$NN.ID <- query$ID[NN$which]
df$dist <- NN$dist
return(df)
}
2) 将此用户定义函数按行应用于数据框“intersections”,查询为与行共享相同street_label的用户子集:
result <- adply(intersections, 1, function(row) NN(row, users[users$label_street == row$label_street, ])
以下是该示例的结果:
head(result)
x y label_street NN.ID NN.dist
1 0.147674 0.132956 5 4325 0.02391247
2 0.235356 0.150813 6 2703 0.03171236
3 0.095337 0.087345 5 21282 0.01760940
4 0.147674 0.132956 6 3460 0.03136304
由于我的真实数据框将非常庞大,因此计算距离矩阵以查看最近邻居可能不太有效,并且使用 adply
会很慢。
有人有类似于 data.table
的解决方案吗?我只知道 data.table
的基础知识,并始终发现它与 plyr
相比非常高效。
label_street
进行split
和ddply
吗? - QLGlapply
?也许这样更好... - M. PapenbergRANN::nn2
(带有列x、y和新列),同时确保邻居在同一条街道标签内?这样就不需要任何循环了! - M. Papenberg