在3D矩阵中标记点 - 必须有一个更优雅的解决方案

时间:2017-05-16 20:31:35

标签: r spatial euclidean-distance

我有两个数据集,包括X,Y,Z坐标,dfA和dFB,如果点之间的距离小于某个值d,我想添加一个带有从dfB到dfA的变量的列。

这是我正在尝试使用的数据示例(实际上dfA和dfB各有1000多行):

dfA<-data.frame(matrix(ncol=5, nrow=40))
names(dfA) <- c("ID","G","x","y", "z")

dfA$ID<-round(runif(40, min=10, max=50),0)
dfA$G<-round(runif(40, min=0.5, max=15),3)
dfA$x<-round(runif(40, min=0, max=100),1)
dfA$y<-round(runif(40, min=0, max=100),1)
dfA$z<-round(runif(40, min=0, max=100),1)


dfB<-data.frame(matrix(ncol=5, nrow=20))
names(dfB) <- c("ID","TPH","x","y", "z")

dfB$ID<-round(runif(20, min=100, max=200),0)
dfB$TPH<-round(runif(20, min=100, max=1000),0)
dfB$x<-round(runif(20, min=0, max=100),1)
dfB$y<-round(runif(20, min=0, max=100),1)
dfB$z<-round(runif(20, min=0, max=100),1)

所以我想得到的是每个dfA $ ID的dfB $ TPH值,如果这些点在某个最小距离。理想情况下,我也想获得dfB $ ID以及这些点之间的距离。

这是我想到的,但我希望有一个更优雅的解决方案......

library(flexclust)
d<-as.data.frame(dist2(dfA[,3:5],dfB[,3:5]))
colnames(d)<-dfB$ID
dfD<- as.data.table(d)

library(data.table)

dfD<-dfD[, MAX := colnames(.SD)[max.col(.SD, ties.method="first")]]
dfD<-dfD[, MIN2 := colnames(.SD)[which.min(.SD)], by = 1:nrow(dfD)]
dfD<-cbind(dfA["ID"],dfD)
View(dfD)


dfD<-cbind(dfA,dfD)
dfD$di<-0
dfD$TPH<-0
n.smp<-nrow(dfD)

for (i in 1:n.smp){
  j<-dfD[i,"MIN2"]
  dfD[i,"di"]<-dfD[i,j]
  xx<-dfB$TPH[dfB$ID == j]
  dfD[i,"TPH"]<-xx
}

此时我可以过滤掉dfA中的点而没有足够的dfB点,但这看起来很笨重,而且我不期待在我的真实数据上这样做。

有什么建议吗?

非常感谢

0 个答案:

没有答案