R 找到邻居的邻居

R 找到邻居的邻居,r,list,for-loop,dplyr,R,List,For Loop,Dplyr,我有一个df,列出了许多区域(df$area)以及这些区域共享边界的区域(df$next\u area)。 从它开始,我想得到一个类似的df,但与它的邻居的邻居。 我写了以下内容,虽然有效,但看起来非常复杂。 有更好的解决办法吗 library(dplyr) library(tidyr) df <- data.frame(area=c("A","A","B","B","C","C","C","D"),next_area=c("B","C","A" ,"C","A","B",

我有一个df,列出了许多区域(
df$area
)以及这些区域共享边界的区域(
df$next\u area
)。 从它开始,我想得到一个类似的df,但与它的邻居的邻居。 我写了以下内容,虽然有效,但看起来非常复杂。 有更好的解决办法吗

library(dplyr)
library(tidyr)

df <-     data.frame(area=c("A","A","B","B","C","C","C","D"),next_area=c("B","C","A"    ,"C","A","B","D","C") )
    df <- df %>% group_by(area) %>% 
  summarize(next_area = list(sort(unique(as.character(next_area)))))
    df$next_area_exploded <- df$next_area
    for(i in 1:nrow(df)){
      for(j in 1:length(df$next_area[[i]])){
        df$next_area_exploded[[i]][j] <-         list(df$next_area_exploded[[which(df$area==df$next_area[[i]][j])]])
  }
}
df$next_area_exploded <- lapply(df$next_area_exploded, function(x)         unique(unlist(x)))
for(i in 1:nrow(df)){
  df$next_next_area[[i]] <- df$next_area_exploded[[i]]    [!df$next_area_exploded[[i]] %in% df$next_area[[i]]]
  df$next_next_area[[i]] <- df$next_next_area[[i]][!df$next_next_area[[i]]     %in% df$area[[i]]]
  }
df <- df %>% unnest(next_next_area) %>% 
  group_by(area) %>% 
  mutate(col=paste0(seq_along(area),".add")) %>%
  spread(key=col, value=next_next_area)
df$next_area<-NULL; df$next_area_exploded<-NULL 
df_final <- df %>% gather(a,next_next,c(names(df)    [grepl(".add",names(df))])) %>% select(-a) %>% filter(!is.na(next_next))
库(dplyr)
图书馆(tidyr)
df%
汇总(next_area=list(排序(唯一)(如.character(next_areaщщ)))

df$next_area_explodesd您可以将其视为一个图,并为每个节点找到距离为2的所有其他节点:

library(igraph)

df <-  data.frame(area=c("A","A","B","B","C","C","C","D"),
                  next_area=c("B","C","A","C","A","B","D","C") )

g = graph_from_data_frame(df)

distances(g) %>%
    as_tibble(rownames = 'area') %>%
    gather(-area, key = 'next_next_area', value = 'distance') %>%
    filter(distance == 2)
库(igraph)
df%
可存储(行名='区域')%>%
聚集(-area,key='next\u next\u area',value='distance')%>%
过滤器(距离==2)
输出:

# A tibble: 4 x 3
  area  next_next_area distance
  <chr> <chr>             <dbl>
1 D     A                     2
2 D     B                     2
3 A     D                     2
4 B     D                     2
#一个tible:4 x 3
下一个区域\u下一个\u区域距离
1 D A 2
2db2
3 A D 2
4 B D 2

以下是我的方法。我得到了所有潜在的区域——它的邻居和选择的区域,而不是开始和邻居

df %>% 
  inner_join(df %>% 
               rename(next_area = area, 
                      next_next_area = next_area),
             by = "next_area") %>% 
  filter(area != next_next_area) %>% 
  group_by(area) %>% 
  filter(! next_next_area %in% next_area) %>% 
  ungroup()

对于给定的
df
,您的预期输出是什么?代码是有效的,因此它是
df\u final