Создать тиббл цепочки путей из векторов символов, разделенных запятыми - PullRequest
2 голосов
/ 19 июня 2020

Я хочу построить цепочку зависимостей между разными географическими точками. Таблица содержит единственный столбец с путями, разделенными запятыми (,)

У меня есть набор данных с такой структурой:

library(tidyverse)

(df <- tribble(~chain,
               "A,B,C,D", 
               "X,Y,Z"))

#> # A tibble: 2 x 1
#>   chain  
#>   <chr>  
#> 1 A,B,C,D
#> 2 X,Y,Z

Это то, что я ожидал:

tribble(~from, ~to,
        "A",    "B",
        "B",    "C",
        "C",    "D",
        "X",    "Y",
        "Y",    "Z")

# expected result        
#> # A tibble: 5 x 2
#>   from  to   
#>   <chr> <chr>
#> 1 A     B    
#> 2 B     C    
#> 3 C     D    
#> 4 X     Y    
#> 5 Y     Z

Это предлагаемое мной решение:

# my solution:
(routes <- df %>% 
    group_by(chain) %>% 
    summarise(destino = str_split(chain, ",")) %>% 
    mutate(

      from = map(destino, ~ lag(.x)) %>% 
        map(~ .x[!is.na(.x)]),

      to  = map(destino, ~ lead(.x)) %>% 
        map(~ .x[!is.na(.x)])) %>% 

    select(from, to) %>% 
    unnest(cols = everything()))


#> # A tibble: 5 x 2
#>   from  to   
#>   <chr> <chr>
#> 1 A     B    
#> 2 B     C    
#> 3 C     D    
#> 4 X     Y    
#> 5 Y     Z

Можно ли получить тот же результат другим способом? Может быть, с for l oop?

Создано 18.06.2020 с помощью пакета REPEX (v0.3.0)

1 Ответ

1 голос
/ 19 июня 2020

Вот еще способ.

Создать столбец для номера строки, получить данные в отдельных строках, разделенных запятыми, для каждой строки создать новый столбец со следующим значением и сбросить NA значения.

library(dplyr)

df %>%
  mutate(row = row_number()) %>%
  tidyr::separate_rows(chain) %>%
  group_by(row) %>%
  mutate(to = lead(chain)) %>%
  na.omit() %>%
  ungroup %>%
  select(-row, from = chain)

#  from  to   
#  <chr> <chr>
#1 A     B    
#2 B     C    
#3 C     D    
#4 X     Y    
#5 Y     Z    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...