【问题标题】:Match rows in a dataframe by range of values in two columns通过两列中的值范围匹配数据框中的行
【发布时间】:2015-01-25 22:27:00
【问题描述】:

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

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() 包,但这似乎等同于子集()。感谢您的任何见解。

【问题讨论】:

  • 我相信spDists(SpatialPointsDataFrame(cbind(LONG, LAT), data=data[,c(1,4)], proj4string=CRS("+proj=utm +zone=10 +datum=WGS84"))) &lt; 2(使用正确的区域)会给你一个 n x n 矩阵,其中包含彼此接近的内容(2UTM 或更少) )。

标签: r


【解决方案1】:

你可以试试这个解决方案:

# 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-24
    • 1970-01-01
    • 2018-07-05
    相关资源
    最近更新 更多