我如何以编程方式计算desired_output
?
我的数据框的基本结构如下:
airline<-c(0,0,1,0,0,1)
city1<-c('a','a','a','b','b','c')
city2<-c('b','c','d','c','d','d')
desired_output<-c(0,1,1,0,0,1)
mktdf<-data.frame(airline, city1, city2, desired_output)
航空公司虚拟表示航空公司是否在city1和city2之间飞行。如果没有,我想创建一个假人,表明航空公司仍然从city1和city2飞行(但不是在他们之间)。
例如,航空公司没有飞过BETWEEN a和b。然而它确实在&amp; amp; d。另一方面,它永远不会飞离city b
。因此desired_output =0
中的第一行。
在第2行,我们在1
中观察desired_output
。这是因为,虽然我们知道该航空公司从city a
飞过,但后来我们发现它也从city
飞过(但又一次,不在它们之间)。
我很乐意分享我在尝试解决此问题时编写的任何代码,尽管我完全没有成功,我认为这只会让人分心。但是,从广义上讲,我尝试使用dpylr
,looping
和transform
函数。
答案 0 :(得分:1)
作为如何使用igraph获得所需输出的模板,下面是一些代码:
library(igraph)
airline<-c(0,0,1,0,0,1)
city1<-c('a','a','a','b','b','c')
city2<-c('b','c','d','c','d','d')
desired_output<-c(0,1,1,0,0,1)
mktdf<-data.frame(airline, city1, city2, desired_output)
g <- graph_from_data_frame(mktdf[mktdf$airline==1, 2:3], # your actual
# connections,
directed = F, # I am assuming that
# connections are flights back
# AND FORTH
vertices = letters[1:4] # you need to
# provide the list
# of vertices if some
# cities are unconnected
)
plot(g)
现在我们得到组件 - 基本上把它切成了
连接位和未连接节点。我会这样做的
通过将其分解为两个图形,但取决于哪里
你正在进行你可能想要的分析
而components()
功能改为:
comps <- decompose(g, min.vertices = 1)
comps
#> [[1]]
#> IGRAPH 8dfe807 UN-- 3 2 --
#> + attr: name (v/c)
#> + edges from 8dfe807 (vertex names):
#> [1] a--d c--d
#>
#> [[2]]
#> IGRAPH 5bb31f9 UN-- 1 0 --
#> + attr: name (v/c)
#> + edges from 5bb31f9 (vertex names):
我们现在有两张图。您想要一个等于1的指标 你的df中的city1和city2属于同一个组件,否则为零:
as.numeric(mktdf$city1 %in% names(V(comps[[1]])) &
mktdf$city2 %in% names(V(comps[[1]])))
#> [1] 0 1 1 0 0 1
万岁,这是理想的输出。
在这个例子中,我们通过粗略的观察来了解哪个组件是我们正在寻找的组件。 如果你想在列表中找到该组件 组件,您可以检查哪个组件有您的组件 原始边缘
lapply(comps, function(x){all(E(g) %in% E(x))})
#> [[1]]
#> [1] TRUE
#>
#> [[2]]
#> [1] FALSE
在这里,我们看到我们发现的第一个子图是我们想要的那个(如果你有很多很多组件,这可能很重要。另一种方法是采用最大的组件)。
答案 1 :(得分:0)
a=paste0(city1,city2)
b=combn(unlist(strsplit(a[!!(airline)],"")),2,paste0,collapse="")
a%in%b+0L
[1] 0 1 1 0 0 1
mktdf$desired1=a%in%b+0L
> mktdf
airline city1 city2 desired_output desired1
1 0 a b 0 0
2 0 a c 1 1
3 1 a d 1 1
4 0 b c 0 0
5 0 b d 0 0
6 1 c d 1 1