Создать двоичный файл на основе трех других переменных - PullRequest
0 голосов
/ 01 мая 2018

Как мне программно рассчитать 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 мы наблюдаем 1 в desired_output. Это потому, что, хотя мы знаем, что авиакомпания летит с city a, а позже мы видим, что она также летает с city (но опять же, не между ними). ​​

Я рад поделиться любым кодом, который я написал, пытаясь решить эту проблему, хотя я потерпел неудачу и думаю, что это будет отвлекать. Однако, в общем, я пытался использовать dpylr, looping и функцию transform.

Ответы [ 2 ]

0 голосов
/ 01 мая 2018
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
0 голосов
/ 01 мая 2018

В качестве шаблона того, как с помощью 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, если city1 и city2 в вашем df находятся в одном компоненте, а в противном случае ноль:

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

Здесь мы видим, что первый подграф, который мы нашли, - это тот, который мы хотели (это может иметь значение, если у вас много и много компонентов. Другой подход - взять самый большой компонент).

...