Создание фрейма данных из списка - PullRequest
0 голосов
/ 05 июля 2018

Я начинающий пользователь R и у меня есть список из 5 векторов:

[[1]]
[,1] [,2]     
[1,] ""   "EWR/MIA"

[[2]]
 [,1] [,2]     
[1,] ""   "MIA/JFK"

[[3]]
 [,1] [,2]     
[1,] ""   "FLR/BRU"
[2,] ""   "BRU/EVN"

[[4]]
 [,1] [,2]     
[1,] ""   "FCO/JFK"
[2,] ""   "BOS/FCO"

[[5]]
 [,1] [,2]

Этот список был создан из функции str_match_all, которую я использовал для фрейма данных из 5 строк.

Как мне создать новый фрейм данных, который объединит эти результаты в 6 строк? Кроме того, я хотел бы иметь возможность разбить каждый результат на два столбца (например, EWR в столбце 1 и MIA в столбце 2).

Спасибо!

РЕДАКТИРОВАТЬ: Вот мой фрейм данных:

> dput(Egencia.input)
structure(list(Domestic...International = structure(c(2L, 1L, 
1L, 2L, 2L), .Label = c("Domestic", "International"), class = "factor"), 
Ticketing.carrier = structure(c(3L, 2L, 3L, 1L, 1L), .Label = c("Air France", 
"American Airlines", "Delta"), class = "factor"), Routing = structure(c(1L, 
4L, 3L, 2L, 5L), .Label = c("EWR/MIA", "FCO/JFK_BOS/FCO", 
"FLR/BRU/EVN", "MIA/JFK", "New York (Penn S/New Carrollton,M"
), class = "factor")), row.names = c(NA, -5L), class = "data.frame")

И код, который я использую:

Egencia.input <- read.csv("/Users/nliusont/Documents/NYU/R/test2.csv", header=T)

city.pair.temp <- "(?=([A-Z]{3}/[A-Z]{3}))"

city.pairs <- str_match_all(Egencia.input$Routing, city.pair.temp)

Ответы [ 3 ]

0 голосов
/ 05 июля 2018

Поскольку у вас есть список матриц с одинаковым количеством столбцов, самый простой способ - просто rbind их:

result = do.call(rbind, city.pairs)

Узор do.call(f, list(a, b, c)) - это альтернативный способ написания f(a, b, c). Поскольку у вас есть список, вам нужно использовать do.call вместо прямого вызова.

Кроме того, я хотел бы иметь возможность разбить каждый результат на два столбца

Настройте свое регулярное выражение тогда:

city.pair.temp <- "(?=([A-Z]{3})/([A-Z]{3}))"

Таким образом, вы получаете две отдельные группы совпадений, до и после косой черты.

0 голосов
/ 05 июля 2018

На основе вашего Eugenia.input я создал рабочий процесс, который может справиться с этим за один раз. Это может показаться немного сложным, но это не так сложно.

Сначала я добавил идентификатор для отслеживания записей, затем я заменяю _ в JFK_BOS на /, поскольку JFK - остановка перед тем, как отправиться в Бостон из Рима. В-третьих, я использовал ваше регулярное выражение для извлечения всех кодов аэропортов, а на третьем этапе изменения я удалил все пустые столбцы, созданные в списке. Как только это будет сделано, вы можете unnest список маршрутизации, который действует как separate_rows. После этого вы можете просто разделить столбцы на от и до.

library(purrr)
library(dplyr)
library(tidyr)

city.pair.temp <- "(?=([A-Z]{3})/([A-Z]{3}))"

Egencia.output <- Egencia.input %>% 
  mutate(id = row_number(),
         Routing = stringr::str_replace(Routing, "_", "/"),
         Routing = stringr::str_match_all(Routing, city.pair.temp),
         Routing = map(Routing, function(x) x[x != ""])) %>% 
  unnest(Routing) %>% 
  separate(Routing, into = c("from", "to"))

Egencia.output
  Domestic...International Ticketing.carrier id from  to
1            International             Delta  1  EWR MIA
2                 Domestic American Airlines  2  MIA JFK
3                 Domestic             Delta  3  FLR BRU
4                 Domestic             Delta  3  BRU EVN
5            International        Air France  4  FCO JFK
6            International        Air France  4  JFK BOS
7            International        Air France  4  BOS FCO

Запись с надписью «Нью-Йорк (Penn S / New Carrollton, M») - это, если я не ошибаюсь, поезд на поезде из Нью-Йорка в Нью-Карролтон, штат Мэриленд. Я не уверен, что это не должно быть классифицируется как внутренние путешествия.

0 голосов
/ 05 июля 2018

Мы можем использовать map

library(tidyverse)
map_df(lst, ~ 
          .x %>%
              as.data.frame %>%
              separate(V2, into = c("V2", "V3"), sep="/")) %>%
  select(-V1)

данные

lst <- list(cbind("", "EWR/MIA"), cbind("", "MIA/JFK"), 
          cbind(c("", ""), c("FLR/BRU", "BRU/EVN")))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...