基于其他三个变量创建一个二进制文件
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
起飞(但同样,不是在它们之间)。
我很高兴分享我为尝试解决此问题而编写的任何代码,尽管我完全没有成功,而且我认为这只会让人分心。但是,从广义上讲,我尝试过使用 dpylr
、looping
和 transform
函数。
作为如何使用 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
如何以编程方式计算 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
起飞(但同样,不是在它们之间)。
我很高兴分享我为尝试解决此问题而编写的任何代码,尽管我完全没有成功,而且我认为这只会让人分心。但是,从广义上讲,我尝试过使用 dpylr
、looping
和 transform
函数。
作为如何使用 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