2016-01-12 2 views
0

У меня есть два файла. Первый файл имеет три столбца: SiteID, Time и ClusterNo.Сопоставление кластеров из двух файлов на основе двух столбцов

Второй файл имеет четыре столбца: SiteA_ID, SiteB_ID, Time и ClusterNo.

file1 <- data.frame("Site_ID" = sample(74000:74500, 1000, replace =TRUE), "Time" = runif(1000)*100, "ClusterNo." = sample(1:500, 1000, replace = TRUE)) 
file2 <- data.frame("SiteA_ID" = sample(74000:74500, 1000, replace =TRUE),"SiteB_ID" = sample(74000:74500, 1000, replace =TRUE), "Time" =  runif(1000)*100, "ClusterNo." = sample(1:500, 1000, replace = TRUE)) 

Мы должны выяснить, какие кластеры (из file1 и file2) создается отображение таким образом, что SITE_ID из файла1 является соответствие либо с сайта (А или В) file2; и время файла1, а время файла2 имеет разницу не более 2 единиц.

Желаемый выход представляет собой файл, содержащий три колонки: ClusterNoOfFile1 и ClusterNoOfFile2 и CommonSite

[Примечание: CommonSite является общим местом file1 и file2, для которых кластеры отображения]

ответ

1

Ниже приведен подход для достижения что-то в соответствии с тем, что вы собираетесь делать (мне не очень понятно, какой ваш результат должен быть предоставлен вам). Вы можете изменить его на основе того, что вам нужно.

library(dplyr) 
library(tidyr) 

# Generate the data (your code) 
file1 <- data.frame("Site_ID" = sample(74000:74500, 1000, replace =TRUE), "Time" = runif(1000)*100, "ClusterNo." = sample(1:500, 1000, replace = TRUE)) 
file2 <- data.frame("SiteA_ID" = sample(74000:74500, 1000, replace =TRUE),"SiteB_ID" = sample(74000:74500, 1000, replace =TRUE), "Time" =  runif(1000)*100, "ClusterNo." = sample(1:500, 1000, replace = TRUE)) 

# Convert file2 to long format so there is only one site id 
file2Long <- gather(file2, Site_Type, Site_ID, -Time, -ClusterNo.) 

# Inner join with file1 so you retain all rows with matching site id. 
file12 <- inner_join(file1, file2Long, by = 'Site_ID') 

# Compute time difference and store whether it is within range 
file12$TimeDiff2 <- abs(file12$Time.x - file12$Time.y) <= 2 

# Filter the ones that meet the threshold criteria of 2, and retain only 
# columns of interest. 
file12Diff2 <- filter(file12, TimeDiff2 == TRUE) 
file12Diff2 <- select(file12Diff2, ClusterNo..x, ClusterNo..y, Site_ID) 

Вывод будет выглядеть следующим образом (.x мужские file1 и file2 .y означает - вы можете изменить эти имена к тому, что вам нужно, чтобы они были):

ClusterNo..x ClusterNo..y Site_ID 
1   400   96 74308 
2   298   438 74027 
3   397   137 74265 
4   420   286 74395 
5   280   77 74097 
6   176   333 74303 
Смежные вопросы