Для каждого элемента в Dataframe хотите зацикливаться автоматически - PullRequest
0 голосов
/ 03 июля 2019

Я не хочу изменять его, так как у меня много данных, поэтому что-то вроде цикла, который автоматически его переводит Ввод - кадр данных 1

Item     LC     ToLC
8T4121  MW92    WK14
8T4121  WK14    RM11
8T4121  WK14    RS11
8T4121  RS11    OY01
AB7651  MW92    RS11
AB7651  RS11    OY01

Я хочу сделать цикл, в котором я могу получить такой вывод Фрейм данных 2

Item     LC1    LC2    LC3    LC4
8T4121  MW92    WK14   RM11  
8T4121  MW92    WK14   RS11   OY01
AB7651  MW92    RS11   OY01

Я пробовал что-то вроде этого:

bodlane <- lctolc
colnames(bodlane) <- c("Item","Entry","From")

bodlane$To <- lctolc$To[match(bodlane$From, lctolc$From)]
colnames(bodlane) <- c("Item","Entry","Parent","From")

bodlane$To <- lctolc$To[match(bodlane$From, lctolc$From)]
colnames(bodlane) <- c("Item","Entry","Parent","Parent1","From")

bodlane$To <- lctolc$To[match(bodlane$From, lctolc$From)]
colnames(bodlane) <- c("Item","LC","ToLC","Parent1","From","To")

1 Ответ

0 голосов
/ 03 июля 2019

Я полагаю, что это можно решить с помощью igraph таким же образом, как в «рекурсивном» самопостроении в data.table , но без расчета.

Сложность заключается в том, что для каждого Item существуют отдельные графики.Мой подход заключается в разделении фрейма данных на список графиков.Могут быть более краткие решения, в которых используется атрибут вершины type.

Однако приведенный ниже код создает ожидаемый результат:

library(igraph)
library(data.table)
library(magrittr)

lapply(
  lapply(split(lctolc, lctolc$Item), function(x) graph.data.frame(x[, 2:3])), 
  function(x) lapply(
    all_simple_paths(x, from = V(x)[degree(x, mode = "in") == 0], 
                     to = V(x)[degree(x, mode = "out") == 0]),
    function(y) as.data.table(t(names(y))) %>% setnames(paste0("LC", seq_along(.)))
  ) %>% rbindlist(fill = TRUE)
) %>% rbindlist(fill = TRUE, idcol = "Item")
     Item  LC1  LC2  LC3  LC4
1: 8T4121 MW92 WK14 RS11 OY01
2: 8T4121 MW92 WK14 RM11 <NA>
3: AB7651 MW92 RS11 OY01 <NA>

Пояснение

Заполняется

Данные

library(data.table)
lctolc <- fread("
Item     LC     ToLC
8T4121  MW92    WK14
8T4121  WK14    RM11
8T4121  WK14    RS11
8T4121  RS11    OY01
AB7651  MW92    RS11
AB7651  RS11    OY01",
data.table = FALSE)
...