【问题标题】:Create a binary based on three other variables基于其他三个变量创建二进制文件
【发布时间】:2018-05-01 16:10:54
【问题描述】:

如何以编程方式计算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)

航空公司虚拟变量指示航空公司是否在城市 1 和城市 2 之间飞行。在没有的情况下,我想创建一个虚拟对象,表明航空公司仍然从 city1 和 city2 飞行(但不是在它们之间)。

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

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

我很高兴分享我编写的任何尝试解决此问题的代码,尽管我完全没有成功,而且我认为这只会分散注意力。但是,总的来说,我尝试过使用dpylrloopingtransform 函数。

【问题讨论】:

  • 我认为您正在寻找“连接的组件”,可以在使用 igraph 包将数据作为图形读取后找到。 (每个直连都是“边”;每个城市都是“节点”。)示例:stackoverflow.com/q/30407769
  • 谢谢@Frank,看来我需要一段时间才能掌握这一点,但感谢您的快速回复!

标签: r dataframe conditional


【解决方案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

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

【讨论】:

  • 这对于我需要的东西来说似乎有点令人费解,但获得视觉效果真的很酷,谢谢!
【解决方案2】:
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

【讨论】:

    猜你喜欢
    • 2021-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-09
    • 2021-04-19
    • 2015-08-01
    • 2020-12-15
    • 2023-04-02
    相关资源
    最近更新 更多