问题:我有一个数据框(参见示例数据),其中包含空间点之间的距离('siteA‘和'siteB'),以及它们是否彼此太近(' close ')。我需要一种方法来将彼此接近的站点组合成一个向量。在示例数据中:站点1离站点3很近,但离站点2很远。但是,站点3离站点2很近。因此,我需要一种方法来将它们组合成一个向量(针对每个组),并有一个输出,其中站点1、2、3在一个矢量中;站点4和5在一个矢量中。然后将所有向量组合成一个列表。
# ----------------------------- #
# --- Example table of data --- #
# ----------------------------- #
siteA siteB distance close
1 1 2 2913.35364 FALSE
2 1 3 1894.23651 TRUE
3 1 4 96487.01697 FALSE
4 1 5 96485.33550 FALSE
5 2 3 1642.27932 TRUE
6 2 4 93185.78766 FALSE
7 2 5 93183.73986 FALSE
8 3 4 102445.53187 FALSE
9 3 5 102448.58978 FALSE
10 4 5 3.47365 TRUE
# ----------------------------- #
# Example console output for expected results:
> expected_results
[[1]]
[1] 1 2 3
[[2]]
[1] 4 5这个表已经包含了站点对之间的所有组合,但我需要所有重叠对的组合(如果close = TRUE)作为每个组的一个向量(比如上面的expected_results )。
在示例数据中只有5个站点,但这些站点可以从2到20+变化,并且在示例中距离为2500,低于2500的任何值都被认为是接近的,但是,该值也可以根据用户输入而变化。
# Example dataset
df <- data.frame(
siteA = c(1, 1, 1, 1, 2, 2, 2, 3, 3, 4),
siteB = c(2, 3, 4, 5, 3, 4, 5, 4, 5, 5),
distance = c(2913.35364, 1894.23651, 96487.01697, 96485.33550, 1642.27932, 93185.78766, 93183.73986, 102445.53187, 102448.58978, 3.47365),
close = c(FALSE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE)
)我正在努力寻找解决方案,任何指导都将不胜感激。很抱歉没有提供示例代码,我尝试了多种循环方法,但最终都以失败告终。
谢谢!
发布于 2020-06-26 21:11:56
它可能会以更好的方式完成,只需要很少的改进。
代码
library(tidyverse)
df <- data.frame(
siteA = c(1,1,1,1,2,2,2,3,3,4),
siteB = c(2,3,4,5,3,4,5,4,5,5),
close = c(F,T,F,F,T,F,F,F,F,T)
)
unvisited_sites <- df %>%
select(contains("site")) %>%
unlist() %>%
unique()
site_groups <- list()
i <- 1
while(length(unvisited_sites) > 0){
visited_sites <- NULL
S <- unvisited_sites[[1]]
while(length(S) > 0){
u <- S[[1]]
sites <- df %>%
filter(siteA == u | siteB == u) %>%
filter(close == TRUE) %>%
select(siteA, siteB) %>%
unlist() %>%
unique() %>%
intersect(unvisited_sites)
visited_sites <- union(visited_sites, sites)
unvisited_sites <- setdiff(unvisited_sites, u)
S <- union(S, intersect(sites, unvisited_sites)) %>% setdiff(u)
}
site_groups[[i]] <- visited_sites %>% sort()
i <- i + 1
}输出
site_groups
[[1]]
[1] 1 2 3
[[2]]
[1] 4 5发布于 2020-06-26 19:49:52
我不完全确定这是否会扩展到更复杂的网站,但它适用于上面的数据。
aggregate(siteA ~ siteB, df[df$close == T,], paste)
siteB siteA
1 3 1, 2
2 5 4https://stackoverflow.com/questions/62593965
复制相似问题