2015-01-25 3 views
2

у меня есть кадр данных, который выглядит следующим образом:Соответствие строк в dataframe по диапазону значений в двух столбцах

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, где я рассматривал разницу между широтой и долготой между двумя строками, но имел проблемы с индексированием. Я хотел бы знать, как сделать этот цикл проверкой каждой строки по каждой другой строке и остановить ее длину (данные [, 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(), но это похоже на подмножество(). Спасибо за понимание.

+0

Я считаю, 'spDists (SpatialPointsDataFrame (cbind (LONG, LAT), данные = данные [, с (1,4)], proj4string = CRS (" + проектируемый = utm + zone = 10 + datum = WGS84 "))) <2' (используйте правую зону) даст вам _n_ x _n_ матрицу того, что рядом друг с другом (2UTM или меньше). – hrbrmstr

ответ

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 
+0

Спасибо, что работает отлично! – user3005032

Смежные вопросы