按两列中的值范围匹配数据框中的行

时间:2015-01-25 22:27:00

标签: r

我有一个如下所示的数据框:

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()。感谢您的任何见解。

1 个答案:

答案 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