基于其他三个变量创建一个二进制文件

Create a binary based on three other variables

如何以编程方式计算 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 起飞(但不在它们之间)。

例如,航空公司不在 a 和 b 之间飞行。然而,它确实在 a 和 d 之间飞行。另一方面,它从不从 city b 起飞。因此 desired_output =0.

中的第一行

在第 2 行中,我们在 desired_output 中观察到 1。这是因为,虽然我们知道航空公司从 city a 起飞,后来我们看到它也从 city 起飞(但同样,不是在它们之间)。

我很高兴分享我为尝试解决此问题而编写的任何代码,尽管我完全没有成功,而且我认为这只会让人分心。但是,从广义上讲,我尝试过使用 dpylrloopingtransform 函数。

作为如何使用 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

在这里我们看到我们找到的第一个 sub.graph 就是我们想要的(如果您有很多组件,这可能很重要。另一种方法是采用最大的组件)。

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