首页 文章

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

提问于
浏览
2

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

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坐标,但每年的网站名称不一致 . 我想搜索数据框并计算出有多少网站(行)可能是另一年的同一网站,使用的标准是 both 网站的纬度和经度应该在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 回答

  • 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
    

相关问题