我有一个如下所示的数据框:
SITE_ID <- c("A", "B", "C", "D")
LAT <- c(450799, 450824, 450825, 450825)
LONG <- c(6513879, 6513873, 6513873, 6513874)
YEAR <- c(2006, 2006, 2007, 2008)
data <- data.frame(SITE_ID, LAT, LONG, YEAR)
每年对一系列网站进行一系列采样并记录其UTM坐标,但每年的网站名称不一致。我想搜索数据框,并使用两者一个网站的纬度和经度应该在的范围内,确定有多少网站(行)可能是另一年的同一网站彼此2个UTM单元,以便被视为同一站点。例如,在上面的数据框中,Site_ID B,C和D都应被视为同一站点。因此,对于每一行,我会想要一个新名称,例如,一个具有更正的Site_ID名称的新列(在上面的示例中,站点B,C,D将被重命名为站点1或某些此类名称)。
我尝试使用for循环,我查看了2行之间的纬度和经度之间的差异,但是索引存在问题。我想知道如何使这个循环检查每一行对每隔一行并停止长度(数据[,1])。
count <- 0
for (i in 1:length(data[,1])) {
for (j in 1:length(data[,1])) {
if (abs(data$LAT[i] - data$LAT[i+1]) <
2 & abs(data$LONG[i] - data$LONG[i+1]) < 2)
count <- count + 1
print(rownames(data[i]))
}
}
我也尝试使用sqldf()包,但这似乎等于subset()。感谢您的任何见解。
答案 0 :(得分:2)
您可以尝试此解决方案:
# get the distance matrices for LAT and LONG
d.lat <- as.matrix(dist(data$LAT))
d.long <- as.matrix(dist(data$LONG))
# build the adjacency matrix
m <- d.lat <= 2 & d.long <=2
# obtain the connected components
library(igraph)
g <- graph.adjacency(m)
z <- clusters(g)$membership
# create new id
data$new_id <- ave(as.character(data$SITE_ID),z,FUN=function(s) paste(s,collapse=','))
# SITE_ID LAT LONG YEAR id new_id
# 1 A 450799 6513879 2006 1 A
# 2 B 450824 6513873 2006 2 B,C,D
# 3 C 450825 6513873 2007 2 B,C,D
# 4 D 450825 6513874 2008 2 B,C,D